C/C++ 跨平台I/O操作技巧

译者序:文章的内容很简单,也不见得完全正确。跨平台I/O需要考虑的事情远非这篇文章的篇幅所能描述,这里介绍的只是一些最基本,最简单的需要注意的事情。
以下是翻译的正文:


如果你正在写从文件或网络读写数据的跨平台C/C++代码,那么你必须明白有些问题是因语言,编译器,平台而不同的。 主要的问题是数据对齐,填充,类型大小,字节顺序和默认状态char是否有符号。

对齐

特定机器上,特定的数据被对齐于特定的边界。如果数据没有正确对齐,结果可能是效率降低甚至崩溃。 当你从I/O源读取数据的时候,确保对齐是正确的。

填充

"填充" 是数据集合中不同元素之间的间隔, 一般是为了对齐而存在。不同编译器和平台下,填充的数量可能会不同。 不要假设结构的大小和成员的位置在任何编译器和平台下都是相同的。 不要一次性读取或者写入一整个结构体,因为写入的程序可能会使用和读取的程序不同的填充方式。对于域也同样适用。

类型大小

不同数据类型的大小随编译器和平台而不同。 在C/C++中, 内置类型的大小完全取决于编译器(在特定范围内). 不要读写大小不明确的数据类型。也就是说,不要读写bool, enum, long, int, short, float, 或者double类型.(译者注:事实似乎不是这样,我记得C/C++标准规定了一些数据类型的长度,例如short 2字节,long 4字节等等,在符合标准规定的编译器上,使用这些类型可以保证跨平台的正确性)

用这些替代这些...
int8, uint8char, signed char, unsigned char, enum, bool
int16, uint16short, signed short, unsigned short, enum
int32, uint32int, signed int, unsigned int, long, signed long, unsigned long, enum
int64, uint64long, signed long, unsigned long
int128, uint128long long, signed long long, unsigned long long
float32float
float64double

字节顺序

字节顺序,就是字节在内存中存储的顺序。 不同的处理器存储多字节数据的顺序是不同的。 小端处理器由低到高存储(换句话说,和书写的顺序相反).。大端处理器由高到低存储(和书写顺序相同)。如果数值的字节顺序和读写它的处理器不同,它必须被事先转化。同时,为了标准化网络传输的字节顺序,定义了网络字节顺序。

char - 有符号还是无符号?

一个鲜为人知的事实,char默认可以是有符号的也可以是无符号的-完全取决于编译器。结果导致你从char转化为其他类型的时候(比如int),结果会因编译器而不同。  例如:

char   x;
int    y;

read( fd, &x, 1 );   // 读取一个byte值为0xff
y = x;               // y 是 255 或者 -1, 依赖编译器

不要把数据读入一般的char。明确指定是有符号或者无符号的。

 

C/C++标准的确没有规定内置类型的长度,这个偶记错了,不过在win平台下,msdn对数据类型的长度有如下说明。

通过这些说明,可以看出,在64位机器上,int是64位,而long仍然是32位(4字节)的......

Data Type Ranges

C/C++ recognizes the types shown in the table below.

Type NameBytesOther NamesRange of Values
int*signed,
signed int
System dependent
unsigned int*unsignedSystem dependent
__int81char,
signed char
–128 to 127
__int162short,
short int,
signed short int
–32,768 to 32,767
__int324signed,
signed int
–2,147,483,648 to 2,147,483,647
__int648none–9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
char1signed char–128 to 127
unsigned char1none0 to 255
short2short int,
signed short int
–32,768 to 32,767
unsigned short2unsigned short int0 to 65,535
long4long int,
signed long int
–2,147,483,648 to 2,147,483,647
unsigned long4unsigned long int0 to 4,294,967,295
enum*noneSame as int
float4none3.4E +/- 38 (7 digits)
double8none1.7E +/- 308 (15 digits)
long double10none1.2E +/- 4932 (19 digits)

The long double data type (80-bit, 10-byte precision) is mapped directly to double (64-bit, 8- byte precision) in Windows NT and Windows 95.

Signed and unsigned are modifiers that can be used with any integral type. The char type is signed by default, but you can specify /J to make it unsigned by default.

The int and unsigned int types have the size of the system word. This is two bytes (the same as short and unsigned short) in MS-DOS and 16-bit versions of Windows, and 4 bytes in 32-bit operating systems. However, portable code should not depend on the size of int.

Microsoft C/C++ also features support for sized integer types. See __int8, __int16, __int32, __int64 for more information. Also see Integer Limits.

                 http://blog.csdn.net/pbmichael

FROM:   http://blog.vckbase.com/panic/archive/2005/05/09/5231.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值