一, 数据类型特别是 int 相关的类型在不同位数机器的平台下长度不同. C99 标准并不规定具体数据类型的长度大小, 只规定级别. 作下比较:
16 位平台
char 1 个字节 8 位
short 2 个字节 16 位
int 2 个字节 16 位
long 4 个字节 32 位
指针 2 个字节
32 位平台
char 1 个字节 8 位
short 2 个字节 16 位
int 4 个字节 32 位
long 4 个字节
long long 8 个字节
指针 4 个字节
64 位平台
char 1 个字节
short 2 个字节
int 4 个字节
long 8 个字节 (区别)
long long 8 个字节
指针 8 个字节 (区别)
二, 编程注意事项
为了保证平台的通用性, 程序中尽量不要使用 long 数据库型. 可以使用固定大小的数据类型宏定义:
- 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
三, 使用 int 时也可以使用 intptr_t 来保证平台的通用性, 它在不同的平台上编译时长度不同, 但都是标准的平台长度, 比如 64 位机器它的长度就是 8 字节, 32 位机器它的长度是 4 字节, 定义如下:
- #if __WORDSIZE == 64
- typedef long int intptr_t;
- #else
- typedef int intptr_t;
- #endif
编程中要尽量使用 sizeof 来计算数据类型的大小
以上类型定义都有相应的无符号类型.
另外还有 ssize_t 和 size_t 分别是 sign 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 可能是 long int 类型. 后来 BSD 使用 sock_t 来替代它.
来源: http://www.bubuko.com/infodetail-3280752.html