在计算机中,所有的信息都是以二进制形式表示的,包括数据的存储与计算。
1、整型数据的存储
C语言中,不同的编译器与平台整型数据占有的字节数是不同的,16位的是2个字节,32位的是4个字节,1个字节是8位。这里假设整型数据占2个字节。
对于有符号数最高位是符号位,0代表正数,1代表负数。对于无符号数,全部都是正数或者0。计算机中数值都是以补码形式表示的,这样有符号数与无符号数的运算就会统一起来,进行运算时是不会区分有符号和无符号数,最后以相应的类型解释,就得到相应的结果。
下面以16位的有符号数为例,解释计算机中对数据的存储。
16位的有符号数能表示的数的范围是-32768 ~ 32767,无符号数的范围是0 ~ 65535。
正数的原码、反码和补码是相同的,即符号位为0,其余各位表示数值。(下面虽说表格分成两段,实际上它们在内存中是连续的,这样画是为了便于观察)
1的补码:
127(
2
7
−
1
2^7-1
27−1)的补码:
32767(
2
15
−
1
2^{15}-1
215−1,即两字节所能表示的最大正数)的补码:
负数的原码、反码和补码不同:
(1)原码:符号位为1,其余各位表示数值的绝对值。
(2)反码:符号位是1,其余各位对原码取反。
(3)补码:反码加1
Tips:若对补码再取补码,则可以得到原码。
例如:
-1的原码:
-1的反码:
-1的补码:
-32767的补码:
-32678的补码(2字节所能表示的最小负数):
计算机中表示0的数就是全0,没有-0这一表示。
根据数据的类型可以对相同的存储的数据进行不同的解释,如果-1解释为无符号数,那么就是65535(0xFFFF),而-32767解释为无符号数就是32769(0x8001),-32768解释为无符号数是32768(0x8000)。
2、浮点型数据的存储
计算机中对实型的数据存储和整型是不一样的,它分为符号位、阶码和尾数三部分。实型数据包括单精度浮点型和双精度浮点型数据,它们固定占用的字节数分别是4字节(32位)和8字节(64位)。例如:实数-1.2345e+02是负数,阶码为2,尾数是1.2345。浮点型数据的存储比较复杂,暂时不做详细阐述。
需要注意的是,浮点数的精度是浮动的,一般不能用于精确比较!
3、字符型数据的存储
每个字符在内存中占用1个字节(8位),存储它对应的ASCII。例如字符型常量’A’的ASCII码为65,内存中存储的就是65的补码,如下:
参考 C语言程序设计(第4版)/何钦铭,颜晖 例题及课后习题
参考程序https://gitee.com/sgxgitee/mooc-c