首先介绍一下原码、反码和补码的概念:
原码:符号位用0表示正号,用1表示负号,数值一般用二进制形式表示。
反码:正数的反码与原码相同,负数的反码是对原码(除符号位)按位取反。
补码:正数的补码与原码相同,负数的补码是对它的原码(除符号位外)各位取反,并在末位加1而得到的(或者说是原码的绝对值按位取反后在末位加1)。
注意:0用原码有两种表示方法:00…0(+0)或100…0(-0),用反码有两种表示方法:00…0或111…1,用补码只有一种表示方法:000…0。
下面介绍一个各种数据类型的存储形式:
1. 整形数据
采用补码形式存放在内存中。对于int型数据,如果不指定unsigned或指定signed,则存储单元中最高位代表符号(0位正,1位负);如果指定unsigned,为无符号型,存储单元全部二进位用作存放数据本身,而不包括符号。
下面是常见的数的存储形式:
有符号整形变量a = 32767:
0 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
符号位 |
有符号整形变量a = -32768:
1 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
0 |
符号位 |
(注意:int型范围(特指在Turbo C中)是-32768~32767,因此32767+1之后并不是32768,却变成了-32768,可以看出10…0的确是-32768的补码)
无符号整型变量b = 65535:
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
1 |
代表数据的第1位 |
(注意:无符号型相对于符号型变量来说,其正数范围扩大一倍)
2. 实型数据
实型变量有2中表示方法,小数形式和指数形式(123e3或123E3,注意e/E之前必须有数字,后面指数必须为整数)。在内存中,实数形式是按照指数形式存储的,系统把一个实数数据分成小数部分和指数部分分别存放。
3. 字符常量
字符常量是把它对应的ASCII码(整形变量)值放在内存中(最终是二进制)。