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_t
或int32_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位宽, short
和int
必须至less有 16位宽, long
必须至less有 32位宽,而sizeof (char)
<= sizeof (short)
<= sizeof (int)
<= sizeof (long)
(这些types的无符号版本也是如此)。
根据平台, int
可以是16到64位宽的任何地方。
主要取决于你正在使用的平台。它依赖于编译器和编译器。现在在大多数编译器中, int是4个字节 。 如果你想检查你的编译器使用什么,你可以使用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指令可以分为两类:
- 编译时间说明
- 运行时间说明
编译时间指令是在编译期间执行的那些指令。
运行时指令是在运行时执行的那些指令
大多数开发人员不知道哪些指令属于编译时间,哪些指令属于运行时间。
这里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个字节。