C“int”的大小是2个字节还是4个字节?

C中的整型variables占用2个字节还是4个字节? 它依赖于什么因素?

大部分的教科书都说整数variables占用2个字节。 但是当我运行一个程序打印一个整数数组的连续地址,它显示了4的差异。

我知道它等于sizeof(int)int的大小实际上是依赖于编译器的。 当天,当处理器是16位时, int是2个字节。 目前,在32位和64位系统上,最常见的是4个字节。

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

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

这是C语言中最容易引起混淆的一点,但是C标准只规定了保证支持的整数types的最小范围int保证能够保持-32767到32767,这需要16位。 在这种情况下, int是2个字节。 但是,实现可以超越最低限度,因为您将看到许多现代编译器都使用int 32位(这也意味着4个字节非常普遍)。

你的书说2字节的原因很可能是因为它太旧了。 有一次,这是常态。 一般来说,如果你需要知道在你使用的平台上有多less字节,你应该总是使用sizeof运算符。

为了解决这个问题,C99添加了新的types,你可以明确地要求一个特定大小的整数,例如int16_tint32_t 。 在此之前,没有通用的方法来获得一个特定宽度的整数(尽pipe大多数平台在每个平台上都提供了类似的types)。

没有具体的答案。 这取决于平台。 它是实现定义的。 它可以是2,4或其他。

int背后的想法是它应该与给定平台上的自然“字”大小相匹配:在16位平台上是16位,在32位平台上是32位,在64位平台上是64位, 。 但是,为了向后兼容的目的,一些编译器甚至在64位平台上也喜欢使用32位int

除非使用16位字长的embedded式平台,否则2字节int的时间已经过去了(16位平台?)。 你的课本可能很旧。

这取决于你使用的平台,以及你的编译器是如何configuration的。 唯一的权威答案是使用sizeof()运算符来查看特定情况下整数的大小。

这个问题的答案取决于你正在使用的平台。
但是不pipe平台如何,您都可以可靠地采取以下几种types:

  [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必须至less有 8位宽, shortint必须至less有 16位宽, long必须至less有 32位宽,而sizeof (char) <= sizeof (short) <= sizeof (int) <= sizeof (long) (这些types的无符号版本也是如此)。

根据平台, int可以是16到64位宽的任何地方。

主要取决于你正在使用的平台。它依赖于编译器和编译器。现在在大多数编译器中, int4个字节 。 如果你想检查你的编译器使用什么,你可以使用sizeof(int)

 main() { printf("%d",sizeof(int)); printf("%d",sizeof(short)); printf("%d",sizeof(long)); } 

c编译器承诺的唯一的事情就是short的大小必须等于或小于int,long的大小必须等于或大于int.So如果int的大小是4,那么short的大小可以是2或4,但不能大于比这更长。 它也表示,短期和长期的大小不能相同。

C99 N1256标准草案

JTC1/SC22/WG14/www/docs/n1256.pdf

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

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

5.2.4.2.1整数types的大小<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.5types然后说:

8对于具有相同符号和不同整数转换等级(见6.3.1.1)的任何两个整数types,具有较小整数转换等级的types的值的范围是另一types的值的子范围。

6.3.1.1布尔,字符和整数决定了相对转换等级:

1每个整数types都有一个整数转换等级定义如下:

  • long long int的级别应大于long int的级别,该级别应大于int的级别,该级别应大于short int的级别,该级别应大于signed char的级别。
  • 任何无符号整数types的等级应等于相应的有符号整数types的等级(如果有的话)。
  • 对于所有整数typesT1,T2和T3,如果T1的排名大于T2,T2的排名大于T3,则T1的排名大于T3

这取决于实现,但通常在x86和其他stream行的架构,如ARM int s需要4个字节。 您可以在编译时使用sizeof(int)或其他任何想要检查的types来检查。

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

 #include <stdio.h> int main(void) { printf("size of int: %d", (int)sizeof(int)); return 0; } 

这返回4,但它可能是机器相关的。

本程序可以解释C编程中编译时指令和运行时指令的基本区别

这里是代码:

 #include <stdio.h> main() { int a = 10,b; b= sizeof(a++); // b holds total number of bytes occupied in memory by a printf("\n %d %d \n", a,b); } 

预期的输出应该是: a = 11, b = 4
b保存b在内存中占用的总字节数)

输出:

 gcc example.c -o example ./example 10 4 

C指令可以分为两类:

  1. 编译时间说明
  2. 运行时间说明

编译时间指令是在编译期间执行的那些指令。

运行时指令是在运行时执行的那些指令

大多数开发人员不知道哪些指令属于编译时间,哪些指令属于运行时间。

这里sizeof是一个编译时操作符,但是++是一个运行时操作符。 所以++是由CPU执行的操作符, sizeof是编译器在编译时执行的关键字。

当编译器遇到这种types的语句b= sizeof(a++) ,它只是用expression式的结果replace。 expression式的结果将是sizeof返回值。 当生成可执行文件时, b将保持4的值。 所以这里a++指令被编译器删除。 因为sizeof是一个编译时指令,它将执行。 现在让我们尝试重新编写代码

 #include <stdio.h> main() { int a = 10,b; b = sizeof(a); a++; printf("\n %d %d \n", a,b); } 
 gcc example.c -o example ./example 11 4 

我们不能期望所有的指令都是由CPU来运行的。

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

但是,这个问题是一种总是事实的答案:“是的,都是。”

这取决于你的架构。 如果要使用16位或更less的计算机,则不能是4个字节(= 32位)。 如果您正在使用32位或更好的机器,则其长度为32位。

要弄清楚,让你的程序准备输出一些可读的东西,并使用“sizeof”函数。 这将返回您声明的数据types的字节大小。 但是在数组中使用这个方法是很有用的。

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

 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。 如果你发送一个数组到一个函数,记住发送值只是第一个元素的指针。 但是,如果你知道,你的数组的大小是多less。 案例二可以通过定义两个函数来解决,而错过了一些性能。 定义函数(数组t)并定义函数2(数组t,int size_of_t)。 调用“函数(t)”通过一些复制工作来测量长度,并将结果发送到函数2,在那里你可以做任何你想要的可变数组大小。

Short只会存储2个字节,它可以存储的范围数是32786 — 32767。

现在Integer “INT我”在内存分配将有4个字节。

样品1

 include main() { int x; //this Program Contain 4 Bytes Memory allocating // int y; int z; x= 5; y= 6; z=x+y; cout<<"the value of x is "<} 

样品2

 include main() { short x; //this Program Contain 2 Bytes Memory allocating // short y; short z; x = 5; y =6; z=x+y; cout<<"the value of x is "< } 

它的4个字节,取决于处理器。它可以使用长达8个字节,但如果处理器有32个字节的字比32个字节。