go语言反码补码教学 原码反码补码如何转换
golang 正负数取反
想要知道取反计算过程,首先搞懂 “原码“,“反码”,“补码”,“取反”。
为企业提供成都网站建设、网站设计、网站优化、营销型网站建设、竞价托管、品牌运营等营销获客服务。创新互联公司拥有网络营销运营团队,以丰富的互联网营销经验助力企业精准获客,真正落地解决中小企业营销获客难题,做到“让获客更简单”。自创立至今,成功用技术实力解决了企业“网站建设、网络品牌塑造、网络营销”三大难题,同时降低了营销成本,提高了有效客户转化率,获得了众多企业客户的高度认可!
0变1,1变0
原码是计算机机器数中最简单的一种形式,数值位就是真值的绝对值。原码表示法在最高位为符号:正数该位为0,负数该位为1,原码又称带符号的绝对值。看整数9及-9的原码如下:
9的原码:0000 1001
-9的原码: 1000 1001
重点:对于源码,绝对值相等的正数和负数只有符号位不同。
反码通常是用来由原码求补码或者由补码求原码的过渡码。正数的反码就是其原码,负数的反码就是将原码除符号位以外每位取反(0变1,1变0)。例如:
9的反码:0000 1001
-9的反码:1111 0110
在计算机系统中,数值一律用补码来表示和存储。正数的原码就是其补码。负数的补码是其反码+1.例如:
9的补码:0000 1001
-9的补码:1111 0111
正整数的原码、反码、补码都是一样的。负数的反码是除符号位其他每一位取反,负数的补码是其反码+1
首先明确一个概念,由于在计算机中二进制都是以其补码形式存放在内存中的。所以要知道 ^9 就是对 9 的补码取反,也就是说无论是整数还是负数对其取反都是对其补码取反。
正数9:
原码为: 0000 1001
反码为: 0000 1001
补码为: 0000 1001
1. 取反结果=负数补码 :0000 1001 --- (取反) 1111 0110
注:由于 ^ 位取反操作符,对于符号位也会取反 所以这里得到一个负数的补码,想要计算其真实的值。还需要将其转换成原码。
2. 得反码:1111 0110 - 1 = 1111 0101
补码 = 反码 + 1 (反推) 反码 = 补码 - 1
3. 得原码 1111 0101 -- 1111 1010 = -10
原码 = 反码取反
负数-9:
原码为: 1111 1001
反码为: 1111 0110
补码为: 1111 0111
1. 取反结果=正数补码 1111 0111 ---- 0000 1000
2. 正数原码 = 反码 = 补码 = 0000 1000 = 8
什么是补码,如何转换反码、补码、原码?
反码补码原码怎么转换,来看看方法吧。
1、首先原始代码的最高位是符号位,0表示正,1表示负,中间值表示数字的绝对值。
2、符号的反转,正数符号的反转与原符号相同,负数的补数是该符号的最低有效位数加上1。
3、补数,正数的补数与原代码相同,负数的补数在其倒数第一的基础上加1。零分为+0和-0。 进行不同符号的加法或同一符号的减法时,不能直接进行加法或减法,不能直接给出正负的结果。
4、必须先取绝对值,然后再加上减法。 符号比特由较大的绝对值决定,因此出现了转码。 反码是对原始代码的改进。补码在针对加减运算和正负零的问题上都解决了,平时用的最多的也就是补码。
补码.原码.反码怎么运算的啊.详细一点
原码, 反码和补码的概念.对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式。原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值。反码就是正数的反码是其本身,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。补码就是正数的补码就是其本身,负数的补码是在其原码的基础上, 符号位不变, 其余各位取反。
1. 原码
原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值. 比如如果是8位二进制:
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符号位. 因为第一位是符号位, 所以8位二进制数的取值范围就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
原码是人脑最容易理解和计算的表示方式。
2. 反码
反码的表示方法是:
正数的反码是其本身
负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
可见如果一个反码表示的是负数, 人脑无法直观的看出来它的数值. 通常要将其转换成原码再计算。
3. 补码
补码的表示方法是:
正数的补码就是其本身
负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]补
[-1] = [10000001]原 = [11111110]反 = [11111111]补
对于负数,补码表示方式也是人脑无法直观看出其数值的。通常也需要转换成原码在计算其数值。
为何要使用原码, 反码和补码
在开始深入学习前, 我的学习建议是先"死记硬背"上面的原码, 反码和补码的表示方式以及计算方法。
现在我们知道了计算机可以有三种编码方式表示一个数. 对于正数因为三种编码方式的结果都相同:
[+1] = [00000001]原 = [00000001]反 = [00000001]补
所以不需要过多解释. 但是对于负数:
[-1] = [10000001]原 = [11111110]反 = [11111111]补
可见原码, 反码和补码是完全不同的. 既然原码才是被人脑直接识别并用于计算表示方式, 为何还会有反码和补码呢?
首先, 因为人脑可以知道第一位是符号位, 在计算的时候我们会根据符号位, 选择对真值区域的加减. (真值的概念在本文最开头). 但是对于计算机, 加减乘数已经是最基础的运算, 要设计的尽量简单. 计算机辨别"符号位"显然会让计算机的基础电路设计变得十分复杂! 于是人们想出了将符号位也参与运算的方法. 我们知道, 根据运算法则减去一个正数等于加上一个负数, 即: 1-1 = 1 + (-1) = 0 , 所以机器可以只有加法而没有减法, 这样计算机运算的设计就更简单了。
于是人们开始探索 将符号位参与运算, 并且只保留加法的方法. 首先来看原码:
计算十进制的表达式: 1-1=0
1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2
如果用原码表示, 让符号位也参与计算, 显然对于减法来说, 结果是不正确的.这也就是为何计算机内部不使用原码表示一个数。
为了解决原码做减法的问题, 出现了反码:
计算十进制的表达式: 1-1=0
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原= [0000 0001]反 + [1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
发现用反码计算减法, 结果的真值部分是正确的. 而唯一的问题其实就出现在"0"这个特殊的数值上. 虽然人们理解上+0和-0是一样的, 但是0带符号是没有任何意义的. 而且会有[0000 0000]原和[1000 0000]原两个编码表示0。
于是补码的出现, 解决了0的符号以及两个编码的问题:
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原
这样0用[0000 0000]表示, 而以前出现问题的-0则不存在了.而且可以用[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]原, 这是不正确的)
使用补码, 不仅仅修复了0的符号以及存在两个编码的问题, 而且还能够多表示一个最低数. 这就是为什么8位二进制, 使用原码或反码表示的范围为[-127, +127], 而使用补码表示的范围为[-128, 127]。
因为机器使用补码, 所以对于编程中常用到的32位int类型, 可以表示范围是: [-231, 231-1] 因为第一位表示的是符号位.而使用补码表示时又可以多保存一个最小值。
go语言操作符 ^ 和 &^
很多语言都是采用 ~ 作为按位取反运算符,Go 里面采用的是 ^ 。
如果作为二元运算符,^ 表示按位异或,即:对应位相同为 0,相异为 1。
操作符 ^,按位置零,例如:z = x ^ y,表示如果 y 中的 bit 位为 1,则 z 对应 bit 位为 0,否则 z 对应 bit 位等于 x 中相应的 bit 位的值。
对于有符号的整数来说,是按照补码进行取反操作的(快速计算方法:对数 a 取反,结果为 -(a+1) ),对于无符号整数来说就是按位取反
计算过程
以3为例 3在内存中补码为 0*** 0011
取反 1*** 1100
-1操作 1*** 1011
除符号位取反 1*** 0100 结果为-4
-------------------------------------------
以9为例 9在内存中补码为 0*** 1001
取反 1*** 0110
-1操作 1*** 0101
除符号位取反 1*** 1010 结果为-10
-------------------------------------------
以-5为例 -5在内存中为的补码为 1*** 1011
为什么呢
-5源码 1*** 0101
除符号取反 1*** 1010
+1操作 1*** 1011
-------------------------------------------
那么-5取反怎么算
补码 1***1011取反为 0***0100
因为符号位为0,所以是正数了,正数的补码反码源码都是一个,所以是4
===================================
再看-1
-1源码 1*** 0001
除符号取反 1*** 1110
+1操作 1*** 1111
补码 1*** 1111 取反为 0*** 0000
因为符号位为0,所以是正数了,正数的补码反码源码都是一个,所以是0
go语言取反输出的例子看这里
当前名称:go语言反码补码教学 原码反码补码如何转换
本文路径:http://hbruida.cn/article/hpspep.html