C语言中的整数变量占用2字节还是4字节?它取决于哪些因素?
大多数教科书都说整型变量占用2个字节。 但是当我运行一个程序打印一个整数数组的连续地址时,它显示了4的差值。
C语言中的整数变量占用2字节还是4字节?它取决于哪些因素?
大多数教科书都说整型变量占用2个字节。 但是当我运行一个程序打印一个整数数组的连续地址时,它显示了4的差值。
当前回答
C“int”的大小是2字节还是4字节? C语言中的整数变量占用2字节还是4字节?
C语言允许“字节”不是每“字节”8位。
CHAR_BIT非位域(字节)的最小对象的位数
大于8的值越来越少见。为了获得最大的可移植性,使用CHAR_BIT而不是8。在C语言中,以比特为单位的int的大小是sizeof(int) * CHAR_BIT。
#include <limits.h>
printf("(int) Bit size %zu\n", sizeof(int) * CHAR_BIT);
它取决于哪些因素?
int位大小通常为32或16位。C指定的最小范围:
int INT_MIN -32767类型对象的最小值 int INT_MAX +32767类型对象的最大值 C11dr§5.2.4.2.1
int的最小范围强制比特大小至少为16 -即使处理器是“8位”。在专门的处理器中可以看到64位这样的大小。其他的数值,如18、24、36等,在历史平台上出现过,或者至少在理论上是可能的。现代编码很少担心非2的整数次幂的比特大小。
计算机的处理器和体系结构驱动int位大小的选择。
然而,即使使用64位处理器,出于兼容性原因,编译器的int大小可能是32位的,因为大型代码库依赖于int是32位的(或32/16)。
其他回答
我知道它等于sizeof(int)int的大小实际上取决于编译器。在处理器是16位的时候,一个int是2字节。现在,在32位和64位系统上,它通常是4个字节。
不过,使用sizeof(int)是获得执行程序的特定系统的整数大小的最佳方法。
编辑:修正了在大多数64位系统上int为8字节的错误语句。例如,它在64位GCC上是4字节。
这是C语言中最容易让人困惑的一点,但是C标准只指定了保证支持的整数类型的最小范围。Int保证能够容纳-32767到32767,这需要16位。在这种情况下,int是2字节。然而,实现可以自由地超越这个最小值,因为您将看到许多现代编译器将int设置为32位(这也意味着几乎无处不在的4字节)。
你书上说2字节的原因很可能是因为它很旧。曾几何时,这是常态。一般来说,如果您需要知道它在所使用的平台上有多少字节,则应该始终使用sizeof操作符。
为了解决这个问题,C99添加了新的类型,可以显式地要求指定大小的整数,例如int16_t或int32_t。在此之前,没有通用的方法来获取特定宽度的整数(尽管大多数平台在每个平台的基础上提供了类似的类型)。
没有具体的答案。这取决于平台。它是由实现定义的。它可以是2 4或者别的什么。
int背后的思想是,它应该与给定平台上的自然“字”大小相匹配:16位平台上的16位,32位平台上的32位,64位平台上的64位,你明白了吧。然而,出于向后兼容性的考虑,一些编译器更倾向于在64位平台上使用32位整型。
2字节int的时代已经一去不复返了(16位平台?),除非你正在使用一些16位字长的嵌入式平台。你的课本可能很旧了。
C“int”的大小是2字节还是4字节?
答案是“是”/“不是”/“也许”/“也许不是”。
C编程语言指定了以下内容:最小的可寻址单位,即char,也称为“字节”,宽度恰好为CHAR_BIT位,其中CHAR_BIT至少为8。
因此,C语言中的一个字节不一定是八位,即8位。在过去,第一个运行C代码的平台(和Unix)有4字节的int -但总的int有36位,因为CHAR_BIT是9!
Int应该是平台的自然整数大小,范围至少为-32767…32767. 你可以用sizeof(int)在平台字节中获取int的大小;当你将这个值乘以CHAR_BIT时,你就会知道它有多宽。
虽然36位机器大多已经死亡,但仍有非8位字节的平台。就在昨天,有一个关于德州仪器16位字节MCU的问题,它有一个C99, c11兼容的编译器。
在TMS320C28x上,char, short和int似乎都是16位宽,因此是一个字节。Long int是2字节,Long Long int是4字节。C语言的美妙之处在于,人们仍然可以为这样的平台编写高效的程序,甚至可以以可移植的方式进行!
c99n1256标准草案
http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf
int和所有其他整数类型的大小都是实现定义的,C99只指定:
最小尺寸保证 类型之间的相对大小
5.2.4.2.1“整数类型的大小<limits.h>”给出了最小大小:
1[…它们的实施定义值应等于或大于所示值(绝对值)[…] Uchar_max 255 // 2 8−1 .使用实例 Ushrt_max 65535 // 2 16−1 .使用实例 Uint_max 65535 // 2 16−1 .使用实例 Ulong_max 4294967295 // 2 32−1 .使用实例 Ullong_max 18446744073709551615 // 2 64−1
6.2.5“类型”指:
8对于任意两个具有相同符号和不同整数转换秩的整数类型 (见6.3.1.1),整数转换秩较小的类型的值范围为a 另一类型值的子范围。
6.3.1.1“布尔、字符和整数”确定相对转换等级:
1 Every integer type has an integer conversion rank defined as follows: The rank of long long int shall be greater than the rank of long int, which shall be greater than the rank of int, which shall be greater than the rank of short int, which shall be greater than the rank of signed char. The rank of any unsigned integer type shall equal the rank of the corresponding signed integer type, if any. For all integer types T1, T2, and T3, if T1 has greater rank than T2 and T2 has greater rank than T3, then T1 has greater rank than T3