C 为什么int32_t在stdint.h中别名为int?

C 为什么int32_t在stdint.h中别名为int?,c,C,在我的Linux虚拟机中,即使是iwthint32\u t,如果我给它分配不同的值,它也会给出不同的大小。例如: #include <stdint.h> int32_t i = 0x123456; int main(int argc, char *argv[]) { return 0; } 查看stdint.h,我发现int32\u t只是int的类型定义: typedef int int32_t; 我认为C99标准强制要求int32\t保证正好是4

在我的Linux虚拟机中,即使是iwth
int32\u t
,如果我给它分配不同的值,它也会给出不同的大小。例如:

#include <stdint.h>
int32_t i = 0x123456;


int main(int argc, char *argv[])
{

    return 0;
}
查看
stdint.h
,我发现
int32\u t
只是
int
的类型定义:

typedef int         int32_t;
我认为C99标准强制要求
int32\t
保证正好是4个字节?

C(像C++)有一个叫做“好像”的规则。从语言的角度来看,即使实际的二进制文件不符合C规则,事物也必须看起来像是遵守C规则

特别是,
sizeof(int32_t)
对于像
malloc(100*sizeof(int32_t))
这样的东西来说是最重要的,因为您肯定需要400字节。(或200字节,当字节为16位时)


然而,在这个简单的例子中,您无法通过任何标准方法检测到“缺失”字节,因此这是合法的。

我得到四个字节(RHEL6中的gcc)。我使用
gcc-c-std=c99 a.c-oa.o编译,并使用
objdump-da.o
显示。结果是:
0000000000000000:0:78 56 js 58 2:34 12 xor$0x12,%al
typedef很好,
stdint.h
是随编译器提供的,因此它知道
int
是编译器的4个字节。在32位和64位模式下以及在不同的优化级别上,我也得到了@KlasLindbäck的相同结果。你是怎么编译的?您使用的是什么
objdump
参数?如果执行
objdump-t a.out | grep“[.]data.*\”
,会得到什么?很抱歉,该值应该是
int i=0x123456
,因此该值只有3个字节。我希望gcc生成类似于
56 34 12 00
的内容。C标准将
int32_t
强制为32位,当从运行的程序中观察时,不一定是一个外部工具。尝试
sizeof
,看看您是否给出了合理的结果。尝试创建一个数组,看看指针算法是否与32位类型的指针算法匹配。@Amumu:您可以使用
-z
选项使其完全显示零。原理是正确的,但实际上这只是
objdump
的一个表示问题;可执行的
.data
部分直接映射到内存中(在COW或类似的内存中),因此在初始化器较小的全局变量占用较少的可执行空间的情况下,可疑的
.data
优化将相当复杂(可能不值得)实现(如果你想解决这类尺寸问题,你可能只是想把整个事情升级)@MatteoItalia:我可以想象一个优化,其中64位和32位变量可以有32位、16位或8位的初始值设定项。那么,你就不会在ELF可执行文件的
.data
部分找到它们,编译器可能必须将它们放入
.bss
中,并有一些启动代码从
.rodata
对它们进行初始化。只要也就是说,我不认为这样的优化可以与OP所看到的兼容。
typedef int         int32_t;