C中的Integer变量是占用2个字节还是4个字节?它取决于哪些因素?
大多数教科书都说整数变量占用2个字节.但是当我运行程序打印整数数组的连续地址时,它显示了4的差异.
yhy*_*nus 162
我知道它等于sizeof(int).a的大小int实际上取决于编译器.在当天,当处理器是16位时,一个int是2个字节.如今,它通常是32位和64位系统上的4个字节.
尽管如此,使用sizeof(int)是获取程序执行的特定系统的整数大小的最佳方法.
编辑:修复了int大多数64位系统上8字节的错误语句.例如,它在64位GCC上是4个字节.
Fat*_*ror 98
这是C中最容易引起混淆的一个点,但C标准仅指定了保证支持的整数类型的最小范围.int保证能够保持-32767到32767,这需要16位.在那种情况下,int是2个字节.但是,实现可以自由地超出最小值,因为您将看到许多现代编译器生成int32位(这也意味着4个字节非常普遍).
你的书说2个字节的原因很可能是因为它已经过时了.有一段时间,这是常态.通常,sizeof如果需要查找正在使用的平台上有多少字节,则应始终使用运算符.
为了解决这个问题,C99添加了新类型,您可以明确地要求某个大小的整数,例如int16_t或int32_t.在此之前,没有通用的方法来获得特定宽度的整数(尽管大多数平台在每个平台的基础上提供了类似的类型).
AnT*_*AnT 31
没有具体的答案.这取决于平台.它是实现定义的.它可以是2,4或其他东西.
背后的想法int是,它应该匹配给定的平台上的天然"字"的大小:在16位平台上的16位,在32位平台上的32位,64位在64位平台上,你的想法.但是,出于向后兼容的目的,一些编译器int甚至更喜欢在64位平台上坚持使用32 位.
2字节int的时间虽然很长(16位平台?),除非你使用的是一些16位字大小的嵌入式平台.你的教科书可能很旧.
Pri*_*ora 19
这个问题的答案取决于您使用的平台.
但无论平台如何,您都可以可靠地假设以下类型:
[8-bit] signed char: -127 to 127
[8-bit] unsigned char: 0 to 255
[16-bit]signed short: -32767 to 32767
[16-bit]unsigned short: 0 to 65535
[32-bit]signed long: -2147483647 to 2147483647
[32-bit]unsigned long: 0 to 4294967295
[64-bit]signed long long: -9223372036854775807 to 9223372036854775807
[64-bit]unsigned long long: 0 to 18446744073709551615
Run Code Online (Sandbox Code Playgroud)
Fli*_*mzy 11
C中的Integer变量是占用2个字节还是4个字节?
这取决于您正在使用的平台,以及编译器的配置方式.唯一的权威答案是使用sizeof运算符来查看特定情况下整数的大小.
它取决于哪些因素?
可能最好考虑范围,而不是尺寸.两者在实践中都会有所不同,但是按照我们将要看到的范围而不是大小来选择变量类型会更加万无一失.同样重要的是要注意标准鼓励我们考虑选择基于范围而不是大小的整数类型,但是现在让我们忽略标准实践,让我们的好奇心探索sizeof,字节CHAR_BIT和整数表示......让我们深入研究兔子洞,亲眼看看......
sizeof,字节和 CHAR_BIT
以下陈述取自C标准(与上述相关),用我认为无法改进的词语来描述.
的
sizeof操作者产生其操作数的大小(以字节为单位),其可以是表达或类型的括号名称.大小由操作数的类型确定.
假设清楚的理解将引导我们讨论字节.通常假设一个字节是8位,实际上CHAR_BIT告诉你一个字节中有多少位.这只是在讨论常见的两个(或四个)字节整数时不考虑的另一个细微差别.
让我们总结一下:
sizeof =>以字节为单位的大小,和CHAR_BIT =>字节中的位数因此,根据系统的不同,sizeof (unsigned int)可以是任何大于零的值(不仅是2或4),因为如果CHAR_BIT是16,则单个(16位)的字节中有足够的位来表示通过所描述的16位整数标准(引用如下).这不一定是有用的信息,是吗?让我们深入研究......
整数表示
C标准规定的最小精度/范围所有标准整数类型(和CHAR_BIT,也FWIW)这里.由此,我们可以得出一个最小的需要多少位来存储的价值,但我们可能也只是选择根据我们的变量范围.尽管如此,这个答案所需的大部分细节都存在于此.例如,以下标准unsigned int要求(至少)16位存储:
Run Code Online (Sandbox Code Playgroud)UINT_MAX 65535 // 2¹? - 1
因此,我们可以看到unsigned int需要(至少)16位,这是你得到两个字节的位置(假设CHAR_BIT是8)......以及稍后当该限制增加时2³² - 1,人们说明了4个字节.这解释了您观察到的现象:
大多数教科书都说整数变量占用2个字节.但是当我运行程序打印整数数组的连续地址时,它显示了4的差异.
你正在使用一本古老的教科书和编译器来教你非便携式的C; 撰写教科书的作者可能甚至都不知道CHAR_BIT.您应该升级您的教科书(和编译器),并努力记住IT是一个不断发展的领域,您需要保持领先竞争......但是,足够的; 让我们看看那些基础整数字节存储的其他非便携秘密......
值位是常见的误解似乎在计算.上面的示例使用unsigned整数类型,它通常只包含值位,因此很容易错过细节中的恶魔.
符号位 ...在上面的示例中,我引用UINT_MAX了上限,unsigned int因为它是16从注释中提取值的一个简单示例.对于有符号类型,为了区分正值和负值(即符号),我们还需要包含符号位.
Run Code Online (Sandbox Code Playgroud)INT_MIN -32768 // -(2¹?) INT_MAX +32767 // 2¹? - 1
填充位 ...虽然遇到具有整数填充位的计算机并不常见,但C标准允许这种情况发生; 一些机器(即这一台机器)通过将两个较小的(带符号)整数值组合在一起来实现更大的整数类型......当你组合有符号整数时,你会得到一个浪费的符号位.浪费的位被认为是填充在填充比特的C.其他例子包括奇偶校验位和陷阱位.
正如您所看到的,标准似乎鼓励在选择整数类型时考虑范围,例如INT_MIN...... INT_MAX和标准中的其他最小值/最大值,并且不鼓励依赖于大小,因为还有其他微妙因素可能会被遗忘,例如CHAR_BIT填充位可能会影响值sizeof (int)(即两字节和四字节整数的常见误解忽略了这些细节).
Cir*_*四事件 11
C99 N1256标准草案
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),具有较小整数转换等级的类型的值范围是另一种类型的值的子范围.
和6.3.1.1"布尔,字符和整数"确定相对转换等级:
1每个整数类型都有一个整数转换等级,定义如下:
- long long int的等级应大于long int的等级,该等级应大于int的等级,其应大于short int的等级,short rank应大于signed char的等级.
- 任何无符号整数类型的等级应等于相应的有符号整数类型的等级(如果有的话).
- 对于所有整数类型T1,T2和T3,如果T1的秩大于T2且T2的秩大于T3,则T1的秩大于T3
唯一的保证是char必须至少 8位宽,short并且int必须至少为 16位宽,并且long必须至少为 32位宽,并且sizeof (char)<= sizeof (short)<= sizeof (int)<= sizeof (long)(对于这些类型的无符号版本也是如此) ).
int 取决于平台,可以是16到64位宽.
小智 5
主要取决于您使用的平台.它取决于编译器到编译器.目前在大多数编译器中int都是4个字节.如果要检查编译器使用的是什么,可以使用sizeof(int).
main()
{
printf("%d",sizeof(int));
printf("%d",sizeof(short));
printf("%d",sizeof(long));
}
Run Code Online (Sandbox Code Playgroud)
c编译器承诺的唯一事情是short的大小必须等于或小于int,long的大小必须等于或大于int.So如果int的大小是4,那么short的大小可以是2或4但不大比那更长.对于long和int来说这是真的.它还说短和长的大小不能相同.
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。您可以使用来获得int平台字节的大小sizeof(int);当您将此值乘以时,CHAR_BIT您将知道它的位数。
尽管36位计算机大多数情况下都死定了,但仍有一些平台使用非8位字节。就在昨天,有关一个具有16位字节的Texas Instruments MCU的问题,该MCU具有 C99,C11兼容编译器。
上的TMS320C28x看来char,short并且int是所有 16个位宽,因此一个字节。long int是2个字节,又long long int是4个字节。C的美丽之处在于,人们仍然可以为这样的平台编写高效的程序,甚至可以以可移植的方式完成它!