深入浅出:举个🌰解读原码、反码和补码

深入浅出:举个🌰解读原码、反码和补码在 Go 语言中,int8 代表有符号 8 位整数。你觉得输出结果是什么呢?我们在文末再公布答案,在此之前,我们先来回顾一下有符号整数是什么。 一个数在计算机中的二进制表示称为机器数,这个机器数是带符号的。它的最高位是符号位,0 代表正数,1 代表负数。 以 8 位有符号整数为…

先来看一道 Go 语言中简单的运算题:

package main

import "fmt"

func main() {
        var a int8 = -128
        var b = a / -1
        fmt.Println(b)
}

在 Go 语言中,int8 代表有符号 8 位整数。你觉得输出结果是什么呢?我们在文末再公布答案,在此之前,我们先来回顾一下有符号整数是什么。

有符号整数

一个数在计算机中的二进制表示称为机器数,这个机器数是带符号的。它的最高位是符号位,0 代表正数,1 代表负数。

以 8 位有符号整数为例,0000 0001 代表十进制中的 1,1000 0001 则代表十进制中的 -1。

深入浅出:举个🌰解读原码、反码和补码

那么,你可能会问了:这样一来,8 位有符号整数的可表达范围应当是 [1111 1111, 0111 1111],即 [-127, 127],但实际上它的可表达范围却是 [-128, 127],那么 -128 又从何而来呢?

想要理解 -128 的来历,我们还要知道原码、反码和补码的概念。

原码、反码和补码

计算机需要使用特定的编码方式存储数据,原码、反码和补码都是一种特定的编码方式。以下示例均以 8 位二进制数举例。

原码

原码是「未经更改的码」,指一个二进制数左边加上符号位后所得到的码。

  • 当二进制数大于 0 时,符号位为 0
  • 当二进制数小于 0 时,符号位为 1
-127 和 127 的原码表示

因此,用这种编码方式表示有符号的 8 位二进制数,它的取值范围是 [1111 1111, 0111 1111],即 [-127, 127]。

如果我们使用原码计算 (+1) + (-1) 会得到什么结果呢?

(+1) + (-1) = 

0000 0001(原码) 
+
1000 0001(原码)
=
1000 0010(原码) 
=
(-2)

What? 等于 -2 了?这显然是错误的答案。

反码

为了解决「正负数相加」的问题,人类又发明了反码

反码的表示方式为:

  • 正数的反码等于它的原码
  • 负数的反码则保留其原码符号位,然后对其他位进行取反操作

取反操作:将 0 变为 1,1 变为 0。

今天的文章深入浅出:举个🌰解读原码、反码和补码分享到此就结束了,感谢您的阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/22759.html

(0)
编程小号编程小号

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注