C中的Integer变量占用2个字节还是4个字节?
这取决于您使用的平台以及编译器的配置方式。唯一权威的答案是使用sizeof
运算符来查看特定情况下整数的大小。
它取决于哪些因素?
最好考虑范围,而不是大小。两种方法在实践中都会有所不同,尽管我们会看到,按范围选择变量类型比选择大小要容易得多。还需要注意的是,该标准鼓励我们考虑基于范围而不是大小来选择整数类型,但是现在让我们忽略标准做法,让我们好奇心探索sizeof
,字节CHAR_BIT
和整数表示...让我们深入研究一下兔子洞,亲眼看看...
sizeof
,字节和 CHAR_BIT
以下声明取自C标准(链接至上文),以我认为无法改进的语言来描述。
的sizeof
操作者产生其操作数的大小(以字节为单位),其可以是表达或类型的括号名称。大小由操作数的类型确定。
假定您有一个清晰的认识,将导致我们对字节进行讨论。通常会假设一个字节为八位,而实际上却CHAR_BIT
告诉您一个字节中有多少位。在谈论常见的两个(或四个)字节整数时,这只是细微差别中的另一个而已。
到目前为止,让我们总结一下:
sizeof
=>大小(以字节为单位),以及
CHAR_BIT
=>字节中的位数
因此,根据您的系统,它sizeof (unsigned int)
可以是大于零的任何值(不只是2或4),就好像CHAR_BIT
是16,则单个(十六位)字节中有足够的位来表示由十六进制描述的十六位整数。标准(如下所述)。那不一定是有用的信息,是吗?让我们深入研究...
整数表示
C标准规定的最小精度/范围所有标准整数类型(和CHAR_BIT
,也FWIW)这里。由此,我们可以得出一个最小的需要多少位来存储的价值,但我们可能也只是选择根据我们的变量范围。但是,此答案所需的大部分细节都位于此处。例如,以下标准unsigned int
要求(至少)十六位存储:
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
从注释中。对于有符号类型,为了区分正值和负值(即符号),我们还需要包括符号位。
INT_MIN -32768 // -(2¹⁵)
INT_MAX +32767 // 2¹⁵ - 1
填充位 ...虽然遇到整数填充位整数的计算机并不常见,但C标准允许这种情况发生。有些机器(例如,这台机器)通过将两个较小的(带符号的)整数值组合在一起来实现较大的整数类型……当您组合带符号的整数时,会浪费符号位。在C中,该浪费的位被视为填充。填充位的其他示例可能包括奇偶校验位和陷阱位。
如您所见,在选择整数类型时,该标准似乎鼓励考虑诸如INT_MIN
.. INT_MAX
和其他最小/最大值之类的范围,并且不鼓励依赖大小,因为还有可能遗忘其他细微的因素,例如CHAR_BIT
填充位和可能会影响的值sizeof (int)
(即,对两字节和四字节整数的常见误解忽略了这些细节)。