这些事跨平台编程导致的; 一、数据类型特别是int相关的类型在不同位数机器的平台下长度不同。C99标准并不规定具体数据类型的长度大小,只规定级别。作下比较:
16位平台
char
16位平台
char
short int long 指针 32位平台 char short int long long long 8个字节 指针 64位平台 char short int long long long 8个字节 指针 二、编程注意事项 为了保证平台的通用性,程序中尽量不要使用long数据库型。可以使用固定大小的数据类型宏定义: typedef signed char typedef short int typedef int # if __WORDSIZE == 64 typedef long int # else __extension__ typedef long long int #endif 三、使用int时也可以使用intptr_t来保证平台的通用性,它在不同的平台上编译时长度不同,但都是标准的平台长度,比如64位机器它的长度就是8字节,32位机器它的长度是4字节,定义如下: #if __WORDSIZE == 64 typedef long int #else typedef int #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来替代它。 |