c - int 在内存中的表示
问题描述
在int
使用内存中的多个字节表示的体系结构上,C 标准对可能的表示施加了哪些约束?大多数当前系统使用小端或大端表示,但是否有可能有一个具有不同表示的一致系统?能有多大不同?
解决方案
C 标准对可能的表示施加了哪些约束?
3 允许编码:2 的补码、1 的补码、符号幅度。非 2 的补码可以有 -0 或陷阱表示。
int
必须为 16 位或更宽(范围至少为[-32767...32767])。对于真实的历史示例,可能是 36 或 64。
但是有可能有一个具有不同表示的一致系统吗?
示例:PDP-endian
0x01020304 存储为 2、1、4、3。另见@chqrlie。
能有多大不同?
int
可能有填充,char
不能。我不知道有任何int
填充。
int
当一个“字节”超过 16 位时,可能是 1 个“字节”。
IIRC,一些图形处理器使用 64 位“字节”,char
, int
, long
, long long
.
我曾经使用过 64 位long, unsigned long
,其中unsigned long
有 1 个填充位,这样ULONG_MAX == LONG_MAX
. 合规但不寻常。理论上,UINT_MAX == INT_MAX
是可能的——从来没有听说过这样的实现。
在 2020 年,我怀疑以下是普遍的。
端序:或大或小。
2 的补码。(下一个 C 可能需要这个。)
“字节大小”为 8(可能是16、32),
int
是 16 位或 32 位。没有填充。
推荐阅读
- javascript - Javascript没有取消单击带有链接的按钮
- react-native - React Native:无法让 PeerJs 服务器与我的 React Native Client 通信,发回对等 ID
- node.js - Discord.js 无法发送空消息
- datatables - 为数据表中的自然排序添加例外
- mysql - 在最大值上更新表的存储过程
- python - Python socketio等待连接初始化
- arrays - 使用 break 语句打印出数组中不重复数字的 C 程序
- qt - 有没有使用 Lottie 动画的 qt 应用程序的正常示例?
- python - 在 google colab 上使用 pytorch 下载 EMNIST 时出现连接错误
- javascript - 当我添加helmetJS时,字体真棒显示白色方块