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

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

 

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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值