【发布时间】:2012-09-26 05:20:42
【问题描述】:
int的大小是如何决定的?
int 的大小是否真的取决于处理器。 32位机器是32位,16位是16位。
在我的机器上它显示为 32 位,尽管该机器安装了 64 位处理器和 64 位 Ubuntu。
【问题讨论】:
-
这也取决于编译器,因为 C 没有说明 int 的确切大小。
标签: c int 32bit-64bit processor
int的大小是如何决定的?
int 的大小是否真的取决于处理器。 32位机器是32位,16位是16位。
在我的机器上它显示为 32 位,尽管该机器安装了 64 位处理器和 64 位 Ubuntu。
【问题讨论】:
标签: c int 32bit-64bit processor
这取决于实现。 C标准唯一保证的是
sizeof(char) == 1
和
sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
还有一些类型的可表示最小值,这意味着 char 至少有 8 位长,int 至少有 16 位长,等等。
因此必须由实现(编译器、操作系统等)决定并记录在案。
【讨论】:
short long 的编译器。 int 是 16 位,short long 是 24。
double 的大小被指定为“24 或 32”。这是用于微处理器的。
CHAR_BIT 至少为 8,sizeof(int) * CHAR_BIT 必须至少为 16,等等。See here for more。
int 的填充位比long 多,则可能有sizeof (long) < sizeof (int)。 (这样的实现不太可能。)
这取决于编译器。
例如:尝试使用旧的 turbo C 编译器,它会为 int 提供 16 位的大小,因为在编写编译器时字长(处理器可以轻松处理的大小)是 16。
【讨论】:
sizeof int 提供2,并且一个字节中有CHAR_BIT 位。 sizeof返回字节数,一个字节不一定有8位。
这取决于主编译器。 如果您使用 turbo c 表示整数大小为 2 个字节。 否则,您使用的是 GNU gccompiler 意味着整数大小为 4 个字节。 它仅取决于 C 编译器中的实现。
【讨论】:
整数的大小基本上取决于您系统的architecture。
一般来说,如果你有一台16-bit 机器,那么你的compiler 必须支持size 2 byte. 的int
如果您的系统是 32 位的,那么编译器必须支持 4 字节的整数。
更详细的,
data bus 的概念出现在画面中是的,16 位,32 位仅表示系统中的 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 和 @ 987654328@ 而不是对int 和long 做出假设。)
在许多情况下,将int 设为int32_t 实际上可以生成更好、更高效的代码。 int 的数组每个元素仅使用 4B,其缓存占用空间仅为 int64_t 数组的一半。此外,特定于 x86-64,32 位操作数大小是默认值,因此 64 位指令需要一个额外的代码字节作为 REX 前缀。因此,32 位(或 8 位)整数的代码密度比 16 位或 64 位的要好。 (有关文档/指南/学习资源的链接,请参阅 x86 wiki。)
如果程序需要 64 位整数类型才能正确操作,则不会使用 int。 (将指针存储在 int 而不是 intptr_t 是一个错误,我们不应该让 ABI 变得更糟以适应这样的损坏代码。)编写 int 的程序员可能期望 32 位类型,因为大多数平台就是这样工作的。 (标准当然只保证16bits)。
由于不期望 int 通常是 64 位(例如在 32 位平台上),并且将其设置为 64 位会使某些程序变慢(几乎没有程序更快),int 在大多数情况下是 32 位64 位 ABI。
此外,还需要一个 32 位整数类型的名称,以便 int32_t 成为 typedef 的名称。
【讨论】:
是的。 int 大小取决于编译器大小。
对于 16 位整数,整数的范围在 -32768 到 32767 之间。对于 32 位和 64 位编译器,它会增加。
【讨论】: