C "int"2字节还是4字节?

C语言中的整数变量占用2字节还是4字节?它取决于哪些因素?

大多数教科书说整型变量占用2个字节。 但是当我运行一个程序打印一个整数数组的连续地址时,它显示了4的差值
689674 次浏览

我知道它等于sizeof(int)int的大小实际上取决于编译器。在处理器是16位的时候,int是2字节。现在,在32位和64位系统上,它通常是4个字节。

尽管如此,使用sizeof(int)是获取执行程序的特定系统的整数大小的最佳方法。

编辑:修复了在大多数64位系统上int为8字节的错误语句。例如,它在64位GCC上是4字节。

没有具体的答案。这取决于平台。它是由实现定义的。它可以是2 4或者别的什么。

int背后的思想是,它应该与给定平台上的自然“字”大小相匹配:16位平台上的16位,32位平台上的32位,64位平台上的64位,你明白了吧。然而,出于向后兼容性的考虑,一些编译器更倾向于使用32位的int,即使是在64位平台上。

2字节int的时代已经一去不复返了(16位平台?)除非你正在使用一些16位字长的嵌入式平台。你的课本可能很旧了。

这取决于实现,但通常在x86和其他流行的架构,如ARM ints占用4个字节。你总是可以在编译时使用sizeof(int)或任何你想检查的其他类型进行检查。

如果要确保使用特定大小的类型,请使用<stdint.h>中的类型

C语言中的整数变量占用2字节还是4字节?

这取决于您使用的平台,以及编译器的配置方式。唯一权威的答案是使用sizeof操作符来查看在特定情况下整数的大小。


它取决于哪些因素?

最好考虑范围,而不是大小。这两种方法在实践中都会有所不同,不过,正如我们将看到的那样,根据范围而不是大小来选择变量类型要简单得多。同样重要的是,标准鼓励我们考虑基于范围而不是大小选择整数类型,但现在让我们忽略标准实践,让我们的好奇心探索sizeof,字节和CHAR_BIT,以及整数表示……让我们钻到兔子洞里去亲眼看看……


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是一个不断发展的领域,你需要保持竞争……不过,这就够了;让我们看看底层整数字节还存储了哪些不可移植的秘密……

位值是常见的误解似乎是计数。上面的例子使用了unsigned整数类型,通常只包含值位,所以很容易忽略细节中的魔鬼。

标志位……在上面的例子中,我引用UINT_MAX作为unsigned int的上限,因为从注释中提取值16是一个简单的例子。对于有符号类型,为了区分正数和负数(即符号),我们还需要包括符号位。

INT_MIN                                -32768 // -(2¹⁵)
INT_MAX                                +32767 // 2¹⁵ - 1

填充位……虽然在整数中使用填充位的计算机并不常见,但C标准允许这种情况发生;一些机器(例如这一个)通过将两个更小的(有符号的)整数值组合在一起来实现更大的整型…当你组合有符号整数时,你会得到一个浪费的符号位。这个浪费的位在c语言中被认为是填充。其他填充位的例子可能包括奇偶校验位和trap位


如你所见,标准似乎鼓励考虑诸如INT_MIN..在选择整数类型时INT_MAX标准中的其他最小/最大值,以及依赖于大小的不鼓励,因为还有其他可能被遗忘的微妙因素,如CHAR_BIT和填充位,这些因素可能会影响sizeof (int)的值(即,两字节和四字节整数的常见误解忽略了这些细节)。

#include <stdio.h>


int main(void) {
printf("size of int: %d", (int)sizeof(int));
return 0;
}

这个返回4,但它可能依赖于机器。

这是C语言中最容易让人困惑的一点,但C标准只为保证支持的整数类型指定了最小范围int被保证能够容纳-32767到32767,这需要16位。在这种情况下,int是2字节。然而,实现可以自由地超出这个最小值,因为你会看到许多现代编译器将int设置为32位(这也意味着4字节非常普遍)。

你书上说2字节的原因很可能是因为它很旧。曾几何时,这是常态。一般来说,如果你需要知道它在你使用的平台上有多少字节,你应该总是使用sizeof操作符。

为了解决这个问题,C99添加了新的类型,其中你可以显式地要求一个特定大小的整数,例如int16_tint32_t。在此之前,没有通用的方法来获取特定宽度的整数(尽管大多数平台在每个平台的基础上提供了类似的类型)。

唯一的保证是char必须是至少 8位宽,shortint必须是至少 16位宽,long必须是至少 32位宽,并且sizeof (char) <= sizeof (short) <= sizeof (int) <= sizeof (long)(对于这些类型的无符号版本也是如此)。

int的宽度可能在16到64位之间,这取决于平台。

这主要取决于你使用的平台,取决于不同的编译器。现在,在大多数编译器中,int4个字节的。 如果你想检查你的编译器正在使用什么,你可以使用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

c99n1256标准草案

http://www.open-std.org/JTC1/SC22/WG14/www/docs/n1256.pdf

int和所有其他整数类型的大小都是实现定义的,C99只指定:

  • 最小尺寸保证
  • 类型之间的相对大小

5.2.4.2.1“整型的大小__abc0”;给出最小尺寸:

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“Types"然后说:

8对于任意两个具有相同符号和不同整数转换秩的整数类型 (见6.3.1.1),整数转换秩较小的类型的值范围为a 其他类型值的子范围

和6.3.1.1 &;布尔、字符和整数;确定相对转换等级:

每个整数类型都有一个整数转换等级,定义如下:

  • long long int的秩要大于long int的秩 将大于int的秩,int的秩将大于short的秩
  • . Int,它必须大于带符号char的秩
  • 任何无符号整数类型的秩应等于相应的整数类型的秩 有符号整数类型(如果有的话)
  • 对于所有整数类型T1、T2和T3,如果T1的秩大于T2且T2的秩大于T2 如果T1的秩大于T3,则T1的秩大于T3

这是回答这个问题的一个很好的来源

但这个问题是一种永远真实的回答:“是的。”两个。”

这取决于您的体系结构。如果您要在16位或更少的机器上工作,它不能是4字节(=32位)。如果您在32位或更好的机器上工作,则其长度为32位。

为了弄清楚,让你的程序准备输出一些可读的东西,并使用“sizeof”函数。返回您声明的数据类型的字节大小。但是要小心使用数组。

如果你声明int t[12];,它将返回12*4字节。要获取这个数组的长度,只需使用sizeof(t)/sizeof(t[0])。 如果你要建立一个函数,它应该计算发送数组的大小,记住If

typedef int array[12];
int function(array t){
int size_of_t = sizeof(t)/sizeof(t[0]);
return size_of_t;
}
void main(){
array t = {1,1,1};  //remember: t= [1,1,1,0,...,0]
int a = function(t);    //remember: sending t is just a pointer and equal to int* t
print(a);   // output will be 1, since t will be interpreted as an int itselve.
}

所以这甚至不会返回不同的值。如果你定义了一个数组,然后试图获取数组的长度,使用sizeof。如果将数组发送给函数,请记住发送值只是第一个元素上的指针。但在情况一,你总是知道数组的大小。第二种情况可以通过定义两个函数而忽略一些性能来计算。定义function(数组t)和function2(数组t, int size_of_t)。调用“function(t)”通过一些复制工作测量长度并将结果发送给function2,在那里您可以对可变数组大小做任何想做的事情。

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 1

int最小范围强制位大小为至少 16 -即使处理器是“8位”。在专门的处理器中可以看到64位这样的大小。其他的数值,如18、24、36等,在历史平台上出现过,或者至少在理论上是可能的。现代编码很少担心非2次方的int位大小。

计算机的处理器和体系结构驱动int位大小的选择。

然而,即使使用64位处理器,出于兼容性原因,编译器的int大小可能是32位,因为大型代码库依赖于int是32位(或32/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上,charshortint似乎是所有 16位宽,因此是一个字节。long int是2个字节,long long int是4个字节。C语言的美妙之处在于,人们仍然可以为这样的平台编写高效的程序,甚至可以以可移植的方式进行!