colorful

zc qq:1337220912

 

关于跨平台数据类型的几篇博文 有些矛盾

c++ 中关于int,unsigned int , short的跨平台移植

int类型比较特殊,具体的字节数同机器字长和编译器有关。如果要保证移植性,尽量用__int16 __int32 __int64吧
__int16、__int32这种数据类型在所有平台下都分配相同的字节。所以在移植上不存在问题。
所谓的不可移植是指:在一个平台上编写的代码无法拿到另一个平台上运行时,不能达到期望的运行结果
例如:在32为平台上(所谓32位平台是指通用寄存器的数据宽度是32)编写代码,int 类型分配4个字节,而在16位平台是则分配2个字节,那么在16位上编译出来的exe,
其中是为int分配2字节,而在32位平台上运行时,会按照4个字节来解析,显然会出错误的!!

而对于非int行,目前为止,所有的类型分配的字节数都是兼容的,即不同平台对于同一个类型分配相同的字节数!!

建议:在代码中尽量避免使用int类型,根据不同的需要可以用short,long,unsigned int 等代替。

下面是各个类型一览表【转】

64位指的是cpu通用寄存器的数据宽度是64位的。

数据类型名称字节数别名取值范围
int*signed,signed int操作系统决定,即与操作系统的"字长"有关
unsigned int*unsigned由操作系统决定,即与操作系统的"字长"有关
__int81char,signed char–128 到 127
__int162short,short int,signed short int–32,768 到 32,767
__int324signed,signed int–2,147,483,648 到 2,147,483,647
__int648–9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
bool1false 或 true
char1signed char–128 到 127
unsigned char10 到 255
short2short int,signed short int–32,768 到 32,767
unsigned short2unsigned short int0 到 65,535
long4long int,signed long int–2,147,483,648 到 2,147,483,647
long long8none (but equivalent to __int64)–9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
unsigned long4unsigned long int0 到 4,294,967,295
enum*由操作系统决定,即与操作系统的"字长"有关
float43.4E +/- 38 (7 digits)
double81.7E +/- 308 (15 digits)
long double81.7E +/- 308 (15 digits)
wchar_t2__wchar_t0 到 65,535
类型标识符类型说明长度
(字节)
范围备注
char字符型1-128 ~ 127-27 ~ (27 -1)
unsigned char无符字符型10 ~ 2550 ~ (28 -1)
short int短整型2-32768 ~ 327672-15 ~ (215 - 1)
unsigned short int无符短整型20 ~ 655350 ~ (216 - 1)
int整型4-2147483648 ~ 2147483647-231 ~ (231 - 1)
unsigned int无符整型40 ~ 42949672950 ~ (232-1)
float实型(单精度)41.18*10-38 ~ 3.40*10387位有效位
double实型(双精度)82.23*10-308 ~ 1.79*1030815位有效位
long double实型(长双精度)103.37*10-4932 ~ 1.18*10493219位有效位


发表于 2011-04-15 14:02 阿π 阅读(1812) 评论(4)  编辑 收藏 引用 所属分类: 其它
 
评论
# re: c++ 中关于int,unsigned int , short的跨平台移植
C99应该用int**_t
空明流转 评论于 2011-04-15 16:14  回复  更多评论    
# re: c++ 中关于int,unsigned int , short的跨平台移植
我也做过移植.
影响中16位平台,多用C来开来,多是嵌入式开发.
32、64位在PC、服务器级较多,目前16位已很少.
我个人认为int型相于对long类型要安全.
long类型在windows-64下,仍是32字节;
但在LINUX-64下long和指针是相当的,已升级到了64字节,
如果结构体中使用long,结果大小有变,windows64下做的资源在linux下64处理,会有问题,
最常见的资源头大小就一致.
如果是大型项目,还是建立自己的一套低层基本数据类型封装方为上策.
bbxyard 评论于 2011-04-15 23:33  回复  更多评论    
# re: c++ 中关于int,unsigned int , short的跨平台移植[未登录]
lz说的不对,应该用int8_t, int16_t,int32_t, int64_t, uintXX_t 等等。而以两个下划线开头的那种类型是微软自己的东西,是不可以移植的。
Alex 评论于 2011-04-16 23:52  回复  更多评论    
# re: c++ 中关于int,unsigned int , short的跨平台移植
原来这么复杂啊,分析的好详细,顶!
free keylogger 评论于 2011-09-08 22:46  回复  更多评论    
 

============================================================

C/C++ 32位机器和64位机器 差异问题总结 跨平台 移植问题 语言编程需要注意的64位和32机器的区别  

2011-09-28 22:39:45|  分类: C++ |  标签:c++  64位机  数据类型   |字号 订阅

转载自:http://hi.baidu.com/jrckkyy/blog/item/61d7869b264d64aec8eaf411.html

#include <stddef.h>

OS version:Red Hat Enterprise Linux Server release 5.3 (Tikanga) Linux 2.6.18-128.el5 #1 SMP Wed Dec 17 11:41:38 EST 2008 x86_64 x86_64 x86_64 GNU/Linux

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

size_tm_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 2012-05-15 17:00 多彩人生 阅读(1523) 评论(0)  编辑 收藏 引用 所属分类: 跨平台


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


导航

统计

常用链接

留言簿(3)

随笔分类

随笔档案

搜索

最新评论

阅读排行榜

评论排行榜