整数
C语言标准定义了每种数据类型必须能够表示的最小的取值范围,C和C++都支持有符号(默认)和无符号数。Java只支持有符号数。
w位所能表示的值的范围。最小值是用位向量[00・・・0]表示,也就是整数值 0,而最大值是用位向量[11…1]表示。无符号数的二进制表示有一个很重要的属性,就是每个介于0〜2w-1之间的数都有唯一一 个w位的值编码。
补码编码:
符号位被设置为1时,表示值为负,而当设置为0时,值为非负。同无符号表示一样,在可表示的取值范围内的每个数字 都有一个唯一的w位的补码编码。补码的范围是不对称 的:|TMin|=\TMax\ + l, TMin没有与之对应的正数。因为一半的位模式(符号位设置为1的数)表示负数,而一半的数(符号位设置为0的数)表示负数,因为0是非负数,也就意味着能表示的正数比负数少一个。
C语言标准并没有要求用补码形式来表示有符号整数,但是几乎所有的机器都是这么做的。
C库中的文件<limits.h>定义了一组常量,来限定编译器运行的这台机器的不同整型数据类型的取值范围。定义了常量INT_MAX、INT_MIN和UINT_MAX, 对于一个补码的机器,数据类型int有w位,这些常量就对应于TMaxw、TMinw和UMaxw的值。
ISO C99标准在文件stdint・h中定义了一组数据类型, 它们的声明形如intN_t和uintN_t,指定的是N位有符号和无符号整数。N的具体值与实现相关,但是大多数编译器允许的值为8、16、32和64。因此,通过将它的类型声明为uintl6_t, 我们可以无歧义地声明一个16位无符号变量,而如果声明为int32_t,就是一个32位有符号变量。
在Java中,单字节数据类型称为byte,而不是char,而且没有 long long数据类型。
反码编码:
原码编码:最高有效位是符号位,用来确定剩下的位应该取负权还是正权,
反码和原码对于数字0有两种不同的编码方式,其中把[00-0]都解释为+0。而值-0在原码中表示为[10-0],在反码中表示为[11-1]。
练习题:
答案:
十六进制 | 二进制 | 无符号 | 补码 |
0xE | 1110 | 14 | -2 |
0x0 | 0000 | 0 | 0 |
0x5 | 0101 | 5 | 5 |
0x8 | 1000 | 8 | -8 |
0xD | 1101 | 13 | -3 |
0xF | 1111 | 15 | -1 |
答案:
A | B | C | D | E | F | G | H | I | J |
0x1b8 | 0x14 | 0xfffffe58 | 0xfffffe74 | 0x44 | 0xfffffec8 | 0x10 | 0xc | 0xfffffeec | 0x20 |
440 | 20 | -424 | -396 | 68 | -312 | 16 | 12 | -276 | 32 |