相信许多朋友都遇到过这样的问题。。。今天总结整理了一下网络上的东西。。。大概可以有三种解释[分别是:取反加1;从高位向8位的推理,以及从和-128相邻数的推理,具体如下。](首先把答案告诉大家,是1000 0000):(网络搜集整理而成。。。)
第一种:在计算机中,负数以其正值的补码形式表达。
什么叫补码呢?这得从原码,反码说起。
原码:一个整数,按照绝对值大小转换成的二进制数,称为原码。
比如 00000000 00000000 00000000 00000101 是 5的 原码。
反码:将二进制数按位取反,所得的新二进制数称为原二进制数的反码。
取反操作指:原为1,得0;原为0,得1。(1变0; 0变1)
比如:将00000000 00000000 00000000 00000101每一位取反,
得11111111 11111111 11111111 11111010。
称:
11111111 11111111 11111111 11111010 是
00000000 00000000 00000000 00000101 的反码。
反码是相互的,所以也可称:
11111111 11111111 11111111 11111010 和
00000000 00000000 00000000 00000101 互为反码。
补码:反码加1称为补码。
也就是说,要得到一个数的补码,先得到反码,然后将反码加上1,所得数称为补码。
比如:
00000000 00000000 00000000 00000101 的反码是:
11111111 11111111 11111111 11111010。
那么,补码为:
11111111 11111111 11111111 11111010 + 1 =
11111111 11111111 11111111 11111011
所以,-5 在计算机中表达为:
11111111 11111111 11111111 11111011。转换为十六进制:0xFFFFFFFB。
再举一例,我们来看整数-1在计算机中如何表示。
假设这也是一个int类型,那么:
1、先取1的原码:00000000 00000000 00000000 00000001
2、得反码: 11111111 11111111 11111111 11111110
3、得补码: 11111111 11111111 11111111 11111111
可见,-1在计算机里用二进制表达就是全1。16进制为:0xFFFFFF。
128=10000000
按位取反:01111111
加1 :10000000
没有溢出,因为没有别的数用10000000来表示。这都是定义好的,记住就是了 .
第二个:你用9位以上的二进制来算-128就能算出来了
比如用16位二进制表示
-128
原码: 1 000 0000 1000 0000
反码: 1 111 1111 0111 1111
补码: 1 111 1111 1000 0000
用9位二进制表示
-128
原码 1 1000 0000
反码 1 0111 1111
补码 1 1000 0000
用8位二进制原码表示-128,实现是"巧妇难为无米之炊
@@@@@@@@@@@@@@
在机器中
负数的补码是这样算的:
先将该负数取绝对值,再用二进制表示出这个绝对值
对该二进制数进行取反加一操作就得到负数的补码了
-128 绝对值是 128
128的二进制表示为:
1000 0000
取反
0111 1111
加1
1000 0000
这就是-128的补码
第三个: -128的补码为10000000,我很久才找出一种理解,但只是自己的理解,没有得到谁的认可
按照补码的定义,八位二进制数,一位符号,七位数据,正数补码等于本身,负数补码等于符
号位不变其余每位取反加一,那要先表示出-128的原码,那原码是多少呢?10000000,那是-0
的原码,那怎么写出-128的补码啊,这就是一直困惑的地方
那-127的原码是11111111,补码是10000001,那-127的补码数据部分再小一就是10000000,
那它的原码是多少啊,负数的补码符合一个规律,数据部分原码与补码的和一定,所以原码小的
补码大,那100000000数据部分比10000001小一,那10000000的原码数据部分要比10000001
如果那样的话就可以解释原码(八位二进制数一位符号)的表示范围是-127~127,而补码
的表示范围是-128~127了