在系统上,C中的数据类型“int”是否总是与OS的位数相同?
谢谢!
答案 0 :(得分:6)
不,不一定。仅举一个明显的例子,如果在64位操作系统上使用32位编译器,通常会有32位int
。
C标准中的要求相当低。超出最小尺寸要求,有(§6.2.5/ 5):
'普通''
int
对象具有执行环境体系结构建议的自然大小(大到足以包含INT_MIN
到INT_MAX
范围内的任何值在标题<limits.h>
)中。
如果您需要确定您的类型至少为64位,则可以使用long long
。
其他答案中提到了类似int32_t
的类型。虽然经常用于其他目的,但这种类型的确适用于需要完全 32位宽的类型的情况,而不管它如何影响性能。
这意味着您通常希望避免这些类型。如果您只需确保至少保持64位整数而不会溢出,则long long
或int_fast64_t
是更好的选择(同样适用于32位类型)。现在,对于64位类型,它不同于64位类型会产生很大的不同。
对于32位类型(例如),它可能会有所不同。 int32_t
必须正好是32位宽,但在64位处理器上运行64位操作系统的64位进程中,64位类型很可能更快比32位类型。我将使用int32_t
的一些遗留(但不是非常古老)的代码的速度提高了大约三倍。当时(在32位编译器和操作系统上)它没有引起问题,但在64位系统上,它实施了相当多的额外工作,因为他们真正想要的是int_fast32_t
- - 支持至少32位的最快类型。
同样,在未来的某个时刻,我们将开始使用“大于”64位的处理器,这几乎是不可避免的。当我们这样做时,我们可能会遇到与我们现在使用32位类型的64位类型相同的情况:人们在他们可能需要时会使用int64_t
的很多地方{ {1}},并且它们的代码运行速度会比它真正需要的速度慢得多,因为它们需要它们(例如)128位处理器将操作数掩盖到64位,而不是使用原生大小的处理器。
答案 1 :(得分:2)
没有。它取决于操作系统和体系结构(即:运行操作系统的处理器类型)。常见的原始类型(如int
,unsigned
等)将依赖于系统,因此根据您使用的系统,int
可能是16,32或任意大小。
如果要保证值的大小,则需要使用固定宽度类型。如果您想这样做,请查看<stdint.h>
以及它为您提供的新原语,例如int32_t
,uint8_t
等。
<强>参考强>
<http://www.cplusplus.com/reference/cstdint/>
答案 2 :(得分:1)
标准不要求这样做。实际上它通常可以,但是this thread提到它在嵌入式系统中更常见错误。
答案 3 :(得分:0)
在64位Debian上,这个小程序
#include <stdio.h>
int main() {
#define printSize(aType) printf("sizeof " #aType " = %ld\n", sizeof(aType))
printSize(void*);
printSize(char);
printSize(short);
printSize(int);
printSize(long);
printSize(long long);
}
打印以下内容:
sizeof void* = 8
sizeof char = 1
sizeof short = 2
sizeof int = 4
sizeof long = 8
sizeof long long = 8
因此,不仅{64}系统上int
不需要是64位,还有真实的通用系统,int
的大小与指针大小相悖。因此,您不应该依赖这些类型的大小。
此规则有例外情况,您可以依赖基本类型的大小。这些在C标准中明确提到。最重要的两个是:
char
必须是一个8位(但你不能指望它是有符号或无符号的。)
long long
必须至少为64位。
当然,long
必须至少与int
等一样大。