C语言中的整数变量占用2字节还是4字节?它取决于哪些因素?
大多数教科书都说整型变量占用2个字节。 但是当我运行一个程序打印一个整数数组的连续地址时,它显示了4的差值。
C语言中的整数变量占用2字节还是4字节?它取决于哪些因素?
大多数教科书都说整型变量占用2个字节。 但是当我运行一个程序打印一个整数数组的连续地址时,它显示了4的差值。
当前回答
C语言中的整数变量占用2字节还是4字节?
这取决于您使用的平台,以及编译器的配置方式。唯一权威的答案是使用sizeof操作符来查看在您的特定情况下一个整数有多大。
它取决于哪些因素?
Range might be best considered, rather than size. Both will vary in practice, though it's much more fool-proof to choose variable types by range than size as we shall see. It's also important to note that the standard encourages us to consider choosing our integer types based on range rather than size, but for now let's ignore the standard practice, and let our curiosity explore sizeof, bytes and CHAR_BIT, and integer representation... let's burrow down the rabbit hole and see it for ourselves...
sizeof, bytes和CHAR_BIT
下面的语句,摘自C标准(与上面的链接),用我认为无法改进的语言描述了这一点。
sizeof操作符产生其操作数的大小(以字节为单位),该操作数可以是表达式或带括号的类型名。大小由操作数的类型决定。
假设有了清晰的理解,我们将讨论字节。通常假设一个字节是8位,而实际上CHAR_BIT告诉您一个字节中有多少位。这只是谈论常见的两字节(或四字节)整数时不考虑的另一个细微差别。
让我们来总结一下:
Sizeof =>字节大小,和 CHAR_BIT =>字节数
因此,根据您的系统,sizeof (unsigned int)可以是任何大于0的值(不仅仅是2或4),就像CHAR_BIT是16一样,那么单个(16位)字节中有足够的位来表示标准所描述的16位整数(下面引用)。这不一定是有用的信息,对吧?让我们深入研究……
整数表示
C标准在这里指定了所有标准整数类型(以及CHAR_BIT, fwiw)的最小精度/范围。由此,我们可以推导出存储值所需的最小位数,但我们也可以基于范围来选择变量。尽管如此,这个答案所需的大部分细节都在这里。例如,下面的标准unsigned int需要(至少)16位存储空间:
Uint_max 65535 // 2¹- 1
因此,我们可以看到unsigned int需要(至少)16位,这就是你得到两个字节的地方(假设CHAR_BIT是8)…后来,当这个极限增加到2³²- 1时,人们改为说4个字节。这解释了你观察到的现象:
大多数教科书都说整型变量占用2个字节。但是当我运行一个程序打印一个整数数组的连续地址时,它显示了4的差值。
你使用的是一个古老的教科书和编译器,它教你不可移植的C语言;写你教科书的作者甚至可能不知道CHAR_BIT。你应该升级你的教科书(和编译器),并努力记住it是一个不断发展的领域,你需要保持领先才能竞争……不过,这就够了;让我们看看这些底层整数字节还存储了哪些不可移植的秘密……
价值位是常见的错误概念。上面的例子使用了无符号整数类型,通常只包含值位,所以很容易忽略细节中的魔鬼。
标志位……在上面的例子中,我引用UINT_MAX作为unsigned int的上限,因为从注释中提取值16是一个简单的例子。对于有符号类型,为了区分正数和负数(即符号),我们还需要包括符号位。
32768 / -(2) Inte_max +32767/2 landing - 1
填充位……虽然在整数中使用填充位的计算机并不常见,但C标准允许这种情况发生;有些机器(例如,这台机器)通过将两个较小的(有符号的)整数值组合在一起来实现更大的整型…当你组合有符号整数时,你会得到一个浪费的符号位。这种浪费的位在c语言中被认为是填充位。填充位的其他例子可能包括奇偶校验位和陷阱位。
如您所见,标准似乎鼓励考虑INT_MIN..在选择整数类型时,INT_MAX和其他来自标准的最小/最大值,并且不鼓励依赖于大小,因为还有其他可能被遗忘的微妙因素,如CHAR_BIT和填充位,这些因素可能会影响sizeof (int)的值(即对两字节和四字节整数的常见误解忽略了这些细节)。
其他回答
C语言中的整数变量占用2字节还是4字节?
这取决于您使用的平台,以及编译器的配置方式。唯一权威的答案是使用sizeof操作符来查看在您的特定情况下一个整数有多大。
它取决于哪些因素?
Range might be best considered, rather than size. Both will vary in practice, though it's much more fool-proof to choose variable types by range than size as we shall see. It's also important to note that the standard encourages us to consider choosing our integer types based on range rather than size, but for now let's ignore the standard practice, and let our curiosity explore sizeof, bytes and CHAR_BIT, and integer representation... let's burrow down the rabbit hole and see it for ourselves...
sizeof, bytes和CHAR_BIT
下面的语句,摘自C标准(与上面的链接),用我认为无法改进的语言描述了这一点。
sizeof操作符产生其操作数的大小(以字节为单位),该操作数可以是表达式或带括号的类型名。大小由操作数的类型决定。
假设有了清晰的理解,我们将讨论字节。通常假设一个字节是8位,而实际上CHAR_BIT告诉您一个字节中有多少位。这只是谈论常见的两字节(或四字节)整数时不考虑的另一个细微差别。
让我们来总结一下:
Sizeof =>字节大小,和 CHAR_BIT =>字节数
因此,根据您的系统,sizeof (unsigned int)可以是任何大于0的值(不仅仅是2或4),就像CHAR_BIT是16一样,那么单个(16位)字节中有足够的位来表示标准所描述的16位整数(下面引用)。这不一定是有用的信息,对吧?让我们深入研究……
整数表示
C标准在这里指定了所有标准整数类型(以及CHAR_BIT, fwiw)的最小精度/范围。由此,我们可以推导出存储值所需的最小位数,但我们也可以基于范围来选择变量。尽管如此,这个答案所需的大部分细节都在这里。例如,下面的标准unsigned int需要(至少)16位存储空间:
Uint_max 65535 // 2¹- 1
因此,我们可以看到unsigned int需要(至少)16位,这就是你得到两个字节的地方(假设CHAR_BIT是8)…后来,当这个极限增加到2³²- 1时,人们改为说4个字节。这解释了你观察到的现象:
大多数教科书都说整型变量占用2个字节。但是当我运行一个程序打印一个整数数组的连续地址时,它显示了4的差值。
你使用的是一个古老的教科书和编译器,它教你不可移植的C语言;写你教科书的作者甚至可能不知道CHAR_BIT。你应该升级你的教科书(和编译器),并努力记住it是一个不断发展的领域,你需要保持领先才能竞争……不过,这就够了;让我们看看这些底层整数字节还存储了哪些不可移植的秘密……
价值位是常见的错误概念。上面的例子使用了无符号整数类型,通常只包含值位,所以很容易忽略细节中的魔鬼。
标志位……在上面的例子中,我引用UINT_MAX作为unsigned int的上限,因为从注释中提取值16是一个简单的例子。对于有符号类型,为了区分正数和负数(即符号),我们还需要包括符号位。
32768 / -(2) Inte_max +32767/2 landing - 1
填充位……虽然在整数中使用填充位的计算机并不常见,但C标准允许这种情况发生;有些机器(例如,这台机器)通过将两个较小的(有符号的)整数值组合在一起来实现更大的整型…当你组合有符号整数时,你会得到一个浪费的符号位。这种浪费的位在c语言中被认为是填充位。填充位的其他例子可能包括奇偶校验位和陷阱位。
如您所见,标准似乎鼓励考虑INT_MIN..在选择整数类型时,INT_MAX和其他来自标准的最小/最大值,并且不鼓励依赖于大小,因为还有其他可能被遗忘的微妙因素,如CHAR_BIT和填充位,这些因素可能会影响sizeof (int)的值(即对两字节和四字节整数的常见误解忽略了这些细节)。
这主要取决于你使用的平台,取决于不同的编译器。现在在大多数编译器中,int是4字节。 如果你想检查你的编译器正在使用什么,你可以使用sizeof(int)。
main()
{
printf("%d",sizeof(int));
printf("%d",sizeof(short));
printf("%d",sizeof(long));
}
c编译器唯一承诺的是short的大小必须等于或小于int, long的大小必须等于或大于int。因此,如果int的size是4,那么short的size可能是2或4,但不会大于它。long和int也是如此。上面还说长短不能一样。
这个问题的答案取决于您使用的平台。 但无论平台如何,你都可以可靠地假设以下类型:
[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
唯一的保证是char类型必须至少是8位宽,short和int类型必须至少是16位宽,long类型必须至少是32位宽,并且sizeof (char) <= sizeof (short) <= sizeof (int) <= sizeof (long)(对于这些类型的unsigned版本也是如此)。
根据平台的不同,Int的宽度可以从16位到64位不等。
#include <stdio.h>
int main(void) {
printf("size of int: %d", (int)sizeof(int));
return 0;
}
这个返回4,但它可能依赖于机器。