Record and Summarize

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

C/C++ 32位机器和64位机器差异问题总结

#include <stddef.h>

size_t本身一个作用就是避免考虑64还是32。64位下Long和指针是64位的

size_t m_unNo;
sprintf(path,"%u",m_unNo); //这句在32位机器上正常64位机器上会编译警告:“警告:格式 ‘%u’ 需要类型 ‘unsigned int’,但实参 4 的类型为 ‘size_t’”
//%u 对应 unsigned int在64位机器上还是32位,而size_t已经变成64位了。

char* 指针在64位下是64位

m_pMem = new char[nSize];
int off = (int)m_pMem%nAlign; // 在 32位编译正常,在64位机器上编译报错:“ 错误:从 ‘char*’ 到 ‘int’ 的转换损失精度”

改为

int off = (uint64_t)m_pMem%nAlign; // 因为int在64位下仍为32位,char×已经变位64位了。

就可以达到兼容效果了

一、数据类型特别是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分别是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来替代它。

posted on 2013-12-30 16:54  zhangjing327  阅读(734)  评论(0编辑  收藏  举报