16 进制的常量通常都用作掩码或特别位的值。假如一个没有后缀的 16 进制的常量是 32 位的,并且其高位被置位了,那么他就能够作为无符号整型进行定义。
例如,常数 OxFFFFFFFFL 是个有符号的 long 类型。在 32 位系统上,这会将任何位都置位(每位全为 1),但是在 64 位系统上,只有低 32 位被置位了,结果是这个值是 0x00000000FFFFFFFF.
假如我们希望任何位全部置位,那么一种可移植的方法是定义一个有符号的常数,其值为 -1.这会将任何位全部置位,因为他采用了二进制补码算法。
|
可能产生的另外一个问题是最高位的配置。在 32 位系统上,我们使用的是常量 0x80000000。但是可移植性更好的方法是使用一个位移表达式:
1L << ((sizeof(long) * 8) - 1);
Endianism
Endianism 是指用来存储数据的方法,他定义了整数和浮点数据类型中是如何对字节进行寻址的。
Little-endian 是将低位字节存储在内存的低地址中,将高位字节存储在内存的高地址中。
Big-endian 是将高位字节存储在内存的低地址中,将低位字节存储在内存的高地址中。
表 3 给出了一个 64 位长整数的布局示例。
表 3. 64 位 long int 类型的布局
低地址 高地址
Little endian
Byte 0
Byte 1
Byte 2
Byte 3
Byte 4
Byte 5
Byte 6
Byte 7
Big endian
Byte 7
Byte 6
Byte 5
Byte 4
Byte 3
Byte 2
Byte 1
Byte 0
例如,32 位的字 0x12345678 在 big endian 机器上的布局如下:
表 4. 0x12345678 在 big-endian 系统上的布局
内存偏移量
0
1
2
3
内存内容
0x12
0x34
0x56
0x78
假如将 0x12345678 当作两个半字来看待,分别是 0x1234 和 0x5678,那么就会看到在 big endian 机器上是下面的情况:
表 5. 0x12345678 在 big-endian 系统上当作两个半字来看待的情况
内存偏移量
0
2
内存内容
0x1234
0x5678
然而,在 little endian 机器上,字 0x12345678 的布局如下所示:
表 6. 0x12345678 在 little-endian 系统上的布局
| 内存偏移量 | 0 | 1 | 2 | 3 |
| 内存内容 | 0x78 | 0x56 | 0x34 | 0x12 |
文章整理:西部数码--专业提供域名注册、虚拟主机服务
http://www.west263.com
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!



