数字常量

16 进制的常量通常都用作掩码或特别位的值。假如一个没有后缀的 16 进制的常量是 32 位的,并且其高位被置位了,那么他就能够作为无符号整型进行定义。

例如,常数 OxFFFFFFFFL 是个有符号的 long 类型。在 32 位系统上,这会将任何位都置位(每位全为 1),但是在 64 位系统上,只有低 32 位被置位了,结果是这个值是 0x00000000FFFFFFFF.

假如我们希望任何位全部置位,那么一种可移植的方法是定义一个有符号的常数,其值为 -1.这会将任何位全部置位,因为他采用了二进制补码算法。

long x = -1L;

            

可能产生的另外一个问题是最高位的配置。在 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
以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!