一直不明白signed char的取值范围为什么是-128~127, 在网上看了些信息后,在此做一个个人小结:
在内存中,数据的存储形式都是以补码的形式存放的。
计算机中的符号数有三种表示方法,即原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示“正”,用1表示“负”,而数值位,三种表示方法各不相同。
先看看原码,反码,补码定义:
原码:数值前面增加了一位符号位(即最高位为符号位)在符号位上用"0"表示正数;用"1"表示负数。数值位表示真值的绝对值
反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外
补码:正数的补码与其原码相同,负数的补码为符号位为1,其余位为该数绝对值的原码按位取反,然后加1(也就是其反码加1,符号位除外)
以8为例:
原码:00001000 (符号位为0)
反码:00001000
补码:00001000
所以,正数的原码,反码,补码都是一样的,不变
以-8为例:
原码:10001000 (符号位为1)
反码:11110111
补码:11111000
为什么signed char取值范围是-128~127 ???
其最大正数在内存中的形式为
01111111
也就是数值127
最小负数是多少呢?
首先我想到的是:
11111111
但是将其转为原码为:
10000001 其值是 -1
然后,我再想到是不是这个:
10000000
将其转为原码为:
110000000 其值是 -128
这样就对了,原码是超出了8位,但在内存中数据的存储形式是补码
内存中10000000表示的就是-128,8位数据的最小值