您的位置:首页 > 编程语言 > C语言/C++

C语言各种数据类型的长度是个问题

2016-12-10 12:57 906 查看
C语言各种数据类型的长度是个问题

 

 

C语言中,32位平台,64位平台,各种数据类型的长度定义不同,如果不准备在32和64位(没准还需要和128位)之间移植程序,则没有什么大问题,如果要考虑到移植,这种定义的不同就非常麻烦。Java之类的语言就是好呀,不需要考虑这些问题,数据类型的长度都是确定的。

 

我们测试一下不同平台的区别吧:

int
main(void)

{

     printf("sizeof(char)         
= %d\n",
sizeof(char));

 

     printf("sizeof(shortint)    
= %d\n",
sizeof(shortint));

     printf("sizeof(int)          
= %d\n",
sizeof(int));

     printf("sizeof(longint)     
= %d\n",
sizeof(longint));

     printf("sizeof(longlong
int) = %d\n",
sizeof(longlongint));

 

//   printf("sizeof(shortlong)     = %d\n",
sizeof(shortlong));

     printf("sizeof(long)         
= %d\n",
sizeof(long));

     printf("sizeof(longlong)    
= %d\n",
sizeof(longlong));

//   printf("sizeof(longlong long) = %d\n",
sizeof(long long long));

 

     printf("sizeof(float)  
      = %d\n",
sizeof(float));

     printf("sizeof(double)       
= %d\n",
sizeof(double));

 

     printf("sizeof(size_t)       
= %d\n",
sizeof(size_t));

     printf("sizeof(ssize_t)      
= %d\n",
sizeof(ssize_t));

 

     return EXIT_SUCCESS;

}

 

首先我们看看那些类型是不同的:

 

32平台长度(bytes)

64位平台长度(bytes)

char

1

1

short int

2

2

int

4

4

long int

4

8

long long int

8

8

long

4

8

long long

8

8

float

4

4

double

8

8

size_t

4

8

ssize_t

4

8

 

从上面的结果可以看到不同,所以不要假定上表内颜色背景行的数据长度,因为它是会变化的。

 

另外:size_t/ssize_t就是longunsigned int/long int。如果你在程序中使用到了size_t或者ssize_t就一定要用longunsigned int/long int

 

因为系统的函数会返回上述的这些值,所以必须知道他们的大小并进行相应的防错性转换。而另外的情况,你需要跨不同平台固定数据长度数据类型的话,可以使用一些定长的数据类型,这样子就不会混淆了,类似:

int8_t/int16_t/int32_t/int64_t

uint8_t/uint16_t/uint32_t/uint64_t

 

但是这些定长数据类型和上述的平台字长相关的数据类型之间转换的时候,一定要注意匹配呀,别搞错了数据表达的范围。

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux c语言 数据