前言
我们在进行编程时,对于int、long、long long经常使用,但是对于这些类型占用的字节长度可能不会太确定,尤其是在32位平台、64位平台,会有差异,这些知识点为基础知识,容易忽略的基础知识,本文做下分析记录。
不同平台整型字节长度区别
平台/类型charshortintlonglong long16位1224832位1244864位12488
小结
在32位平台下,int型和long型是一致的,都是占用4个字节。long long 是8个字节。在64位平台下,int型是占用4个字节,而long和long long都是占用8个字节的。尽量不要使用long和long int,因为c/c++标准中,只限制了long int长度不小于int,并未限制long必须是4个字节或者8个字节,也就是跟平台相关,这主要是因为有一些历史兼容性原因。所以要使用明确的long long或者uint64_t
short int和int
int占用1个机器字长,在32位系统中int占32位,即4个字节,而在16位系统中,int占16位,即2个字节,在c++标准中只限制规定short int不能超过int的长度,具体长度可以由编译器的实现厂商决定,所以目前32位编译器中, short int占2个字节,int 占4个字节,short int可以简写为short。类似的,c++标准只限制了long int不得小于int的长度,具体长度也没有作出限制。
long 和 long int
我们会看到long 和 long int,其实这两者对于编译器来说时一样的,我们在使用long时,其实已经默认包括了int,同样long long = long long int。 即long是long int的简写,同样的道理 long long是long long int的简写。
int64_t 和 uint64_t
这两种类型并不是标准的c定义的类型,而是通过typedef重命名的类型,定义在 stdint.h 中:
# if __WORDSIZE == 64
typedef long int int64_t;
# else
__extension__
typedef long long int int64_t;
# endif
#if __WORDSIZE == 64
typedef unsigned long int uint64_t;
#else
__extension__
typedef unsigned long long int uint64_t;
#endif
从上面的代码也可以看到,如果编译器是64位平台,则uint64_t 其实时unsigned long int,而long int是占用8个字节的。反之,如果编译器是32平台,则uint64_t 是unsigned long long int,也是占用8个字节。
验证
程序如下:
#include
#include
#include
int main(void)
{
printf("the os is 64 bit.\n");
printf("__WORDSIZE:%d \n", __WORDSIZE);
printf("char bytes:%d\n", sizeof(char));
printf("short bytes:%d\n", sizeof(short));
printf("int bytes:%d\n", sizeof(int));
printf("float bytes:%d\n", sizeof(float));
printf("long bytes:%d\n", sizeof(long));
printf("long int bytes:%d\n", sizeof(long int));
printf("long long bytes:%d\n", sizeof(long long));
printf("long long int bytes:%d\n", sizeof(long long int));
printf("uint64_t bytes:%d\n", sizeof(uint64_t));
printf("uint32_t bytes:%d\n", sizeof(uint32_t));
printf("size_t bytes:%d\n", sizeof(size_t));
return 0;
}
执行结果如下:
the os is 64 bit.
__WORDSIZE:64
char bytes:1
short bytes:2
int bytes:4
float bytes:4
long bytes:8
long int bytes:8
long long bytes:8
long long int bytes:8
uint64_t bytes:8
uint32_t bytes:4
size_t bytes:8