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