编辑: 王子梦丶 | 2013-06-08 |
1 章中已经介绍过,下面用一种比较简单 的办法来求一个整数的补码表示(假设用 n 个二进制位的内存单元来表示它) : ? 如果是正整数,采用符号-绝对值表示,即最高有效位(符号位)为0表示正,数 的其余部分则表示数的绝对值;
【思考题 3-3】 下列哪些整型常量是合法的? 012,oX7A,00,078,0x5Ac,-0xFFFF,0034,7B. 注意: ? 八进制整数和十六进制整数都是以数字
0 打头,不要写成字母 O 或o;
? 定义十六进制整数时,0x 或0X 后面的 a~f 或A~F 大小写可以交错.例如, 0x6Ac,0XFFbC 都是合法的.
37 基本数据类型、运算符与表达式 第章3?如果是负整数,则先写出与该负数相对应的正数的补码表示,然后将其按位求反, 最后在末位(最低位)加1;
? 然后将上述求得的补码的低 n 位存放于内存单元之中,就得到了该整数在内存中 的表示,内存单元的最高位是符号位(0 表示正,1 表示负) . 在TC2.0 或BC3.1 下,一个整数默认情况下需要两个字节(16 位)的内存单元存放;
而在VC6.0 下, 则需要
4 个字节 (32 位) . 下面来具体看一看几种不同整数在内存中的存放形式. 1)+14 对于
16 位的内存单元来说,(14)补=0000
0000 0000 1110,最前面的
0 为符号位,表示 是正数.其表示形式如图 3-2 所示. 其在内存中的实际存放形式如图 3-3 所示. 图3-2 十进制数+14 两个字节的补码表示形式 图3-3 十进制数+14 两个字节的内存实际存放形式 对于
32 位的内存单元来说,(14)补=0000
0000 0000
0000 0000
0000 0000 1110.其表示 形式如图 3-4 所示. 其在内存中的实际存放形式如图 3-5 所示. 图3-4 十进制数+14 四个字节的补码表示形式 图3-5 十进制数+14 四个字节的内存实际存放形式 记住:数据在内存中的存放位置是高字节放在高地址的存储单元中,低字节放在低 地址的存储单元中.
38 C 语言程序设计教程(第二版) 2)-14 对于
16 位的内存单元来说,先计算(+14)补=0000
0000 0000 1110,然后按位求反,末 位加
1 得(-14)补=1111
1111 1111 0010,最前面的
1 为符号位,表示是负数.其表示形式 如图 3-6 所示. 图3-6 十进制数-14 两个字节的补码表示形式 其在内存中的实际存放形式可参考图 3-3. 对于
32 位的内存单元来说,同样先计算(+14)补=0000
0000 0000
0000 0000
0000 0000 1110,然后按位求反,末位加
1 得(-14)补=1111
1111 1111
1111 1111
1111 1111 0010.其 表示形式如图 3-7 所示.其在内存中的实际存放形式同样可参考图 3-5. 图3-7 十进制数-14 四个字节的补码表示形式 3)-65537 对于
16 位的内存单元来说,先计算(+65537)补=01
0000 0000
0000 0001,然后按位 求反,末位加
1 得(-65537)补=10
1111 1111
1111 1111.再将(-65537)补 的低
16 位存放 于内存之中,所以-65537 在内存中的实际存放的值为:1111
1111 1111 1111,最前面的
1 为符号位,表示是负数,其真值为-1,而不是-65537,也就是说,-65537 在内存中 的值与-1 在内存中的值是一样的,这一点读者务必注意!-65537 在内存中的实际存放 形式如图 3-8 所示. 对于
32 位的内存单元来说,同样先计算(+65537)补=
0000 0000
0000 0001
0000 0000
0000 0001,然后按位求反,末位加
1 得(-65537)补=1111
1111 1111
1110 1111
1111 1111 1111.最前面的
1 为符号位,表示是负数,其真值为-65537,其在内存中的实际存放形式 如图 3-9 所示. 图3-8 十进制数-65537 两个字节的 图3-9 十进制数-65537 四个字节的 内存实际存放形式 内存实际存放形式