补码100000000,原反补的那些事儿!

Posted joker D888

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了补码100000000,原反补的那些事儿!相关的知识,希望对你有一定的参考价值。

补码100000000为什么是-128?

前言:

​ 大家知道计算机底层都是通过补码做的运算,而无论表面是加减乘除还是其他一些运算,底层做的都是加法。原因就不详细展开了,主要是因为这样计算机的运算设计更加简单,而且一切的运算都可以以加法运算为基础。

原,反,补

  • 正数原码,反码,补码相同,而负数的补码是在原码保留最高位符号1位同时对其余各位取反再**+1**而得,即补码取反加一。
  • 而负数的补码求原码,则是求补码的补码,补码取反加一,即符号位不动,其余各位取反后再+1。(或补码减一取反)

问题:char a=127,那你知道a+1的值是多少吗?

#include<iostream>
using namespace std;

int main()
{
	char a=0b00000000;	//对补码进行操作,不断加1.
	while(1) 
	{
		cout<<(int)a<<" "; 
		a++;
	}	
}

在这里你可以看到完整的char类型所能表示的所有大小,以及二进制递增所表示的值的规律。

-128的表示

  • 实际上计算机用反码来计算,大部分真值的结果是正确的,唯一的问题就是“0”这个特殊的数值上,虽然人们对+0和-0是的理解一样,但是0带符号是没有任何意义的. 而且会有[0000 0000](原)和[1000 0000](原)两个编码表示0。

  • 于是补码的出现解决了这个问题。这样0就用[0000 0000]来表示,并且用[1000 0000]来表示-128。

  • (-1)+(-127)=[1000 0001](原)+[1111 1111](原)=[1111 1111](补)+[1000 0001](补)=[1000 0000](补)

  • (-1)+(-127)的结果应该是-128, 在用补码运算的结果中, [1000 0000](补) 就是-128, 但是注意因为实际上是使用之前所谓的“-0”来表示-128, 所以-128并没有原码和反码表示。

  • 你可以对-128的补码[1000 0000](补)来算它的原码,算出来的原码是[0000 0000](原), 这显然是错误的。

综上,你就可以理解了为什么基本的有符号的数据类型的大小范围都是是[-n,n-1];

其他类型基本数据类型道理类似。

以上是关于补码100000000,原反补的那些事儿!的主要内容,如果未能解决你的问题,请参考以下文章

关于整数原反补的一些认识

关于整数原反补的一些认识

java之原反补

有符号的数据表示法(原反补)

计算机基础知识_原码反码补码

计算机基础知识