补吗是为了加减运算才出现的。。。我们都知道如果加一个负数,只要减去他对应的正数即可,
如 3+(-1)=3-1=2
计算机很笨,没这种思维,他加法就是加法
3+(-3) 如果按你的方法表示负数 结果时 0x03+0x83=0x86 显然不是0,因为计算机不会把加法变成减法。。。
那另一种就是取补吗,0x03+0xfd=0x00 这样就符合运算规则,这就是为什么要有补吗,-1 必须要比-2 在代码上大1,
如果只是把首位变成1 ,那仍然不符合这个规则,0x01 0x02如果只是首位变符号,结论是 0x81 小于 0x82 这就是一个错误 -1<-2 不符合逻辑。。。CPU只是个机器,没有智商可言。。。。
计算机对数字的处理 抛开符号位 00000000必须是最小的数,显然拿单字节来说 -128应该全0, 带上符号那么就是1000000是自小的数就是-128。。。。 -1+1应该为0 那么 ff+1=0 所以ff就是-1。。。。
c的char数据属于基本类型,基本类型其中还包括-整型,实型,枚举类型!
数据在内存中是以二进制形式存放的。数值是以补码表示的。
整型:
一个正数的补码和其原码的形式相同。而负数的补码方式是将其绝对值的二进制形式“按位求反再加1”
实型:
在内存中占4个字节,是按照指数形式存储的,实型数据分为小数部分和指数部分,分别存放!计算机用二进制表示小数部分,用2的幂次来表示指数部分!
字符型:
在内存中字符的存储实际上是把字符相对应的ASCII代码放到存储单元中的。而这些ASCII代码值在计算机中也是以二进制形式存放的。这个与整型的存储很相似。因此这两类之间的转换也比较方便!
为什么数据在内存里是以补码的形式存储??
这个问题,很重要,其实,答案却很简单。
计算机,每次进行计算,位数,是固定的。
八位的计算机,每次计算,就只有八位二进制数。
16 位机、32 位机、64 位机 ...,也都是雷同的。
那么:
数值 0,八位机存的就是:0000 0000,这没有疑问吧?
数值 +1,就是 0+1。即:0000 0001,你可以理解吧?
数值-1,那显然就是 0-1 了。
你用二进制算算看,差,是多少?
忽略借位,差,就是:1111 1111 (十进制 255)。
这个正数,就被称为:-1 的补码。
数值-X,怎么存放?
那就按照 0-X 算呗! 也可以得出这种八位的结果。
这就是负数(-X) 的补码。
---------------------
补码,是一个正数。(如:-1 的补码就是 255。)
补码,是一个“代替负数计算”的正数。
这说法,对吗?
你可以验算一下。
比如,等式:-1 + 1 = 0,是必须成立的。
转换为补码:[-1]补 + [+1]补 = [0]补,也应该成立。
代入数值,计算如下:
1111 1111 + 0000 0001 = (1) 0000 0000
你舍弃进位,等式就成立了。
这说明:
用补码(正数),就可以代替负数。
同时,加法,也就代替了减法运算。
用补码计算,与普通二进制的算法相同,逢二进一。
但是,进位,必须舍弃。
---------------------
你的问题是:为什么数据在内存里是以补码的形式存储?
正确答案是:简化算法,从而简化硬件。
这也就是:补码存在的意义。
补码的理论,就是这么简单。
老外算术不行,才编造了“原码反码取反加一符号位不变”。
我们的计算机老师脑子不好用,被老外骗得滴溜滴溜转。
跟着老外绕了老大一圈,也讲不明白“补码的存在意义”。
学生学完了,也不知道:为什么数据在内存里是以补码的形式存储?
方便cpu计算,因为正数和负数的补码相加之后刚好等于0,其他的码好像不行,隐约记得好像是这个原因...