int变量的大小
如何确定int的大小?
int的大小是否真的取决于处理器。 对于32位机器,它将是32位,对于16位,它是16位。
在我的机器上它显示为32位,虽然机器安装了64位处理器和64位Ubuntu。
这取决于实施。 C标准唯一保证的是
sizeof(char) == 1
和
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
以及类型的一些可表示的最小值,这意味着char
至少为8位长, int
至少为16位等。
所以它必须由实现(编译器,操作系统,......)决定并记录下来。
这取决于编译器。
例如:尝试一个旧的turbo C编译器,它会为int提供16位的大小,因为在编写编译器时,字大小(处理器可以用最少的努力解决的大小)是16。
这取决于主编译器。 如果你使用turbo c意味着整数大小是2个字节。 否则你使用GNU gccompiler意味着整数大小是4个字节。 它仅取决于C编译器中的实现。
整数的大小基本上取决于系统的architecture
。 通常,如果您有一个16-bit
机器,那么您的compiler
必须支持size 2 byte.
的int size 2 byte.
如果您的系统是32位,则编译器必须支持4字节的整数。
更多细节,
-
data bus
的概念是图片,16位,32位意味着系统size of data bus
的size of data bus
。 - 数据总线大小是确定整数大小所必需的,因为数据总线的目的是为处理器提供数据。单次提取可以为处理器提供的最大值是重要的,这个最大大小是首选的编译器在一段时间内提供数据。
- 根据系统的数据总线大小,编译器设计为提供数据总线的最大大小作为整数的大小。
x06->16-bit->DOS->turbo c->size of int->2 byte x306->32-bit>windows/Linux->GCC->size of int->4 byte
尽可能扩大int
并不是最好的选择。 (选择由ABI设计师完成。)
像x86-64这样的64位架构可以在int64_t
上高效运行,因此很自然地long
64位。 (由于各种可移植性原因,微软在x86-64 ABI中long
32位,这在现有的代码库和API中是有意义的。这基本上是无关紧要的,因为实际关心类型大小的可移植代码应该使用int32_t
和int64_t
而不是假设关于int
和long
。)
在许多情况下,使int
为int32_t
实际上会产生更好,更有效的代码。 每个元素只使用4B的int
数组只有int64_t
数组的一半缓存占用量。 此外,特定于x86-64,32位操作数大小是默认值,因此64位指令需要额外的代码字节用于REX前缀。 因此,32位(或8位)整数的代码密度比16位或64位更好。 (有关文档/指南/学习资源的链接,请参阅x86 wiki。)
如果程序需要64位整数类型才能正确操作,则不会使用int
。 (将指针存储在int
而不是intptr_t
是一个错误,我们不应该使ABI更糟,以适应这样的破坏代码。)编写int
的程序员可能期望32位类型,因为大多数平台都是这样工作的。 (标准当然只保证16位)。
由于没有期望int
通常是64位(例如在32位平台上),并且使64位将使某些程序更慢(并且几乎没有程序更快),在大多数64位ABI中int
为32位。
此外,还需要一个32位整数类型的名称,因为int32_t
是一个typedef
。
是。 int
size取决于编译器大小。 对于16位整数,整数的范围在-32768到32767之间。对于32位和64位编译器,它将增加。