在Intel文档中,我已经读过Intel x86 64位机器的C数据类型'long'的大小为8个字节。 但是,当我在我的电脑,其具有英特尔(R)核心(TM)13上运行这个简单的代码 - 64位处理器:C数据类型'long'在Intel x86 64位机器上
printf("size of long, is %d", sizeof(long));
控制台输出为4(而不是8)!任何人都可以解释这种差异或相同的原因。 谢谢
在Intel文档中,我已经读过Intel x86 64位机器的C数据类型'long'的大小为8个字节。 但是,当我在我的电脑,其具有英特尔(R)核心(TM)13上运行这个简单的代码 - 64位处理器:C数据类型'long'在Intel x86 64位机器上
printf("size of long, is %d", sizeof(long));
控制台输出为4(而不是8)!任何人都可以解释这种差异或相同的原因。 谢谢
所有C标准说的是,long
必须至少32位,这意味着sizeof(long) >= 4
(的sizeof
的单元,其被称为一个字节,对几乎所有的8位你可能遇到的平台)。
每个ABI定义了这些类型的大小。您需要有兼容的ABI来链接使用不同程序编译的代码,所以总的来说,每种操作系统的每种类型的处理器都有一个标准ABI。这只是一个趋势:某些操作系统具有多个ABI,具体取决于使用的编译器和标准库。
处理器制造商通常会定义一个ABI,但是这取决于操作系统和编译器供应商决定是否尊重它。
在x86_64上,Intel指定了一个64位的long
。这是大多数操作系统所做的,但有一个主要的例外:Windows。在Windows上,标准ABI(由系统库和供应商提供的开发工具使用的)有一个32位的long
。 64位类型可用int64_t
或long long
。
尝试sizeof(unsigned long long)
,这应该是64位。
长可能是32位
'长'不保证是32位。 –
其保证为Windows。 https://msdn.microsoft.com/en-us/library/windows/desktop/aa383751%28v=vs.85%29.aspx。 – Nandu
不,它可以保证* Windows的某些*编译器*。 –
安装了哪个操作系统,是32位还是64位操作系统。 – Kamal
你使用什么编译器? –
什么编译器和哪个版本? 32位或64位? – user3528438