go语言怎么补码 go语言 nil

golang位移运算

之前是写java的,没有无符号有符号之分,最近刷题碰到了位运算的题,就想把这个搞清楚一点。

林甸网站建设公司创新互联建站,林甸网站设计制作,有大型网站制作公司丰富经验。已为林甸上千余家提供企业网站建设服务。企业网站搭建\成都外贸网站制作要多少钱,请找那个售后服务好的林甸做网站的公司定做!

另外常用的int类型是有符号数,位长取决于你的电脑的位长,电脑是64位的int就是64位的。

左移

右移

首先无符号数没啥好说的,不管左移还是右移都是补0

有符号数,以int为例(64位)

老样子,机器内存的是补码

以7fffffffffffffffff为例

从前三个输出看,没有办法直接给int赋最大值(16进制),全f的话会报错,也就是不能直接赋值符号位,

但是第四个输出来看,这里的运算是逻辑位移,输出-2(ffffffffffffffe,找了半天也没找到怎样输出正儿八经的16进制数),也就是位移包括符号位.

之后再右移多少位都是-1(ffffff...f),就是补码位移规则

综上:

。。。。好乱

什么是补码,如何转换反码、补码、原码?

反码补码原码怎么转换,来看看方法吧。

1、首先原始代码的最高位是符号位,0表示正,1表示负,中间值表示数字的绝对值。

2、符号的反转,正数符号的反转与原符号相同,负数的补数是该符号的最低有效位数加上1。

3、补数,正数的补数与原代码相同,负数的补数在其倒数第一的基础上加1。零分为+0和-0。 进行不同符号的加法或同一符号的减法时,不能直接进行加法或减法,不能直接给出正负的结果。

4、必须先取绝对值,然后再加上减法。 符号比特由较大的绝对值决定,因此出现了转码。 反码是对原始代码的改进。补码在针对加减运算和正负零的问题上都解决了,平时用的最多的也就是补码。

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语言取反输出的例子看这里

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


分享标题:go语言怎么补码 go语言 nil
分享路径:http://hbruida.cn/article/dojcojo.html