数值存储方式
原码
- 最高位做为符号位,0 表示正,为 1 表示负
十进制数 | 原码 |
---|---|
+15 | 0000 1111 |
-15 | 1000 1111 |
+0 | 0000 0000 |
-0 | 1000 0000 |
注意
当两个正数相减或不同符号相加时,必须比较两个数的绝对值最大才能得出谁减谁,才能得出结果是正是负,所以不方便加减运算。
反码
- 正数:与原码相同
- 负数:符号位不变,其他取反(0 变 1,1 变 0)
十进制数 | 反码 |
---|---|
+15 | 0000 1111 |
-15 | 1111 0000 |
+0 | 0000 0000 |
-0 | 1111 1111 |
注意
反码运算也不方便,通常作为求补码的过渡
补码
- 正数:原码、反码、补码相同
- 负数:再反码的基础上加 1
十进制数 | 补码 |
---|---|
+15 | 0000 1111 |
-15 | 1111 0001 |
+0 | 0000 0000 |
-0 | 0000 0000 |
WARNING
在计算机系统中,数值一律用补码来存储。
数值溢出
当超过一个数据类型能够存放最大的范围时,数值会溢出。
有符号位最高位溢出的区别:符号位溢出会导致数的正负发生改变,但最高位的溢出会导致最高位丢失。
数据类型 | 占用空间 | 取值范围 |
---|---|---|
char | 1 字节 | -128 到 127(-2^7 ~ 2^7-1) |
unsigned | char | 1 字节 0 到 255(0 ~ 2^8-1) |
有符号和无符号整型取值范围
数据类型 | 占用空间 | 取值范围 |
---|---|---|
short | 2 字节 | -32768 到 32767 (-215 ~ 215-1) |
int | 4 字节 | -2147483648 到 2147483647 (-231 ~ 231-1) |
long | 4 字节 | -2147483648 到 2147483647 (-231 ~ 231-1) |
unsigned short | 2 字节 | 0 到 65535 (0 ~ 216-1) |
unsigned int | 4 字节 | 0 到 4294967295 (0 ~ 232-1) |
unsigned long | 4 字节 | 0 到 4294967295 (0 ~ 232-1) |