首页 > 解决方案 > int 在内存中的表示

问题描述

int使用内存中的多个字节表示的体系结构上,C 标准对可能的表示施加了哪些约束?大多数当前系统使用小端或大端表示,但是否有可能有一个具有不同表示的一致系统?能有多大不同?

标签: cmemorylanguage-lawyerendianness

解决方案


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 位。

  • 没有填充。


推荐阅读