C语言 32/64位机 数据类型字长

本文详细解析了C语言中各种数据类型在32位和64位平台下的长度差异,并提供了通用的数据类型宏定义及使用技巧,旨在帮助开发者在不同平台间编写通用且高效的代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.数据类型特别是int相关的类型在不同位数机器的平台下长度不同。C99标准并不规定具体数据类型的长度大小,只规定相对大小。作下比较:

32位平台:
char         1个字节8位
short        2个字节16位
int          4个字节32位
long         4个字节
long long    8个字节
float        4个字节
double       8个字节
指针          4个字节
有符号和无符号都一样.

64位平台:
char        1个字节
short       2个字节
int         4个字节
long        8个字节(区别)
long long   8个字节
float       4个字节
double      8个字节
指针         8个字节(区别)

2.编程注意事项

为了保证平台的通用性,程序中注意使用long数据库型。可以使用固定大小的数据类型宏定义,这些宏定义需要引用stdint.h头文件:

typedef signed char       int8_t
typedef short int         int16_t;
typedef int               int32_t;
# if __WORDSIZE == 64
typedef long int          int64_t;
# else
__extension__
typedef long long int     int64_t;
#endif

3.使用int时也可以使用intptr_t来保证平台的通用性

它在不同的平台上编译时长度不同,但都是标准的平台字长,比如64位机器它的长度就是8字节,32位机器它的长度是4字节,使用它可以安全地进行整数与指针的转换运算,也就是说当需要将指针作为整数运算时,将它转换成intptr_t进行运算才是安全的。intptr_t需要引用stddef.h头文件,它的定义如下:

#if __WORDSIZE == 64
typedef long int intptr_t;
#else
typedef int intptr_t;
#endif

编程中要尽量使用sizeof来计算数据类型的大小
以上类型定义都有相应的无符号类型。

4.使用ssize_t和size_t

它们分别是unsigned和signed size of computer word size。它们也是表示计算机的字长,在32位机器上是int型,在64位机器上long型。使用它们对于增加平台的通用性有很大好处,从某种意义上来说它们等同于intptr_t和uintptr_t。使用它们也需要引用stddef.h头文件
五、socket的accept函数在有些操作系统上使用size_t是不正确的,因为accept接收的int*类型,而size_t的长度可能会超过int*的长度限制,导致错误。后来BSD使用sock_t来替代它。

ps: 初学计算机,有任何不规范,不准确的细节,尽管提出!一起讨论下.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值