进制就不给大家详细的进行讲解了
1,原码,反码,补码
整数的2进制表⽰⽅法有三种,即原码、反码和补码
1,整数分为有符号的整数和无符号的整数,无符号的整数只有0和正整数,有符号的整数又分为正整数和负整数,正整数的原码反码补码都是一样的,负整数的原码反码补码各不相同,需要进行计算。
有符号整数的三种表⽰⽅法均有符号位和数值位两部分,2进制序列中,最⾼位的1位是被当做符号 位,剩余的都是数值位。其中0表示正数,1表示负数。
原码:直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码:将原码的符号位不变,其他位依次按位取反就可以得到反码。
补码:将反码加一就可以得到。//或者就是将原码进行取反加一直接得到。
补码是在内存中进行储存的,原码是对外进行展示的
相反:要是从补码得到原码也可以直接进行取反加一。
对于整数来说,在内存中存放的就是补码:
(为什么呢? 在计算机系统中,数值⼀律⽤补码来表⽰和存储。原因在于,使⽤补码,可以将符号位和数值域统⼀ 处理;同时,加法和减法也可以统⼀处理(CPU只有加法器)此外,补码与原码相互转换,其运算 过程是相同的,不需要额外的硬件电路。)
2,如果是无符号的整数,那么就没有符号位,全都是数值位,也是32个比特位
2, 移位操作符
<<左移操作符 (针对于整数,移动的是二进制,双目操作符)
>>右移操作符(可以看成箭头指向哪里就是往哪里移动)
注: 移位操作符的操作数只能是整数。
1,左移操作符 移位规则:
左边补0,右边丢弃。
向左边移动一位以后,多出来的直接丢弃,右边补上0,数值改变。
2,右移操作符 移动规则:
⾸先右移运算分两种:
1. 逻辑右移:左边⽤0填充,右边丢弃 2. 算术右移:左边⽤原该值的符号位填充,右边丢弃
(到底我们应该使用哪一种方式,C语言并没有明确的规定,但是常见的编译器都是算术右移,把右边进行丢弃,左边用原值的符号位进行填充。)
给一个例子10吧。
//图中10是正数,原码反码补码都是一样的,右移之后,原本是正数,那么左边就补上0。
那么如果是负数该怎么办呢:-10
这次-10是负数,原码反码补码各不相同,先把他换成补码,再进行运算(操作符的变换一定是用补码进行的)变成补码之后,进行右移两个比特位,这时候由于他原本是-10,是负数,那么符号位是1,就给左边加上两个1。
//⚠警告:在进行移位的时候,不要移动负数,这是在C语言之中没有进行规定的
3,位操作符:&、|、^、~
移位操作符有:(操作的必须是整数) --单目操作符
1,按位与&,
2,按位或 |, 3,按位异或 ^, 4,按位取反 ~,
当有两个数进行这一系列的位操作符的时候,必须要换成二进制位的数字,不然会很难看明白
先把两个数这样进行排列,,,然后把它们一行一行的每一行进行分开,这样上下的看进行比较
1,按位与&--------意思就是当上下这两个数都是1的时候,最终得到的反码才是1,只要有一个是0,那就是0。
2,按位或|---------意思就是当上下这两个数只要有一个是1的时候,那么最终得到的补码就是1,都是0的时候才会是0,两个都是1的话,就还是1。
3,按位异或^--------意思就是当上下这两个数如果他们相同的话那么最终得到的补码就是0,但是如果上下两个数(一个是0,一个是1),那么最终得到的补码就是1。
4,按位取反~--------单目操作符,对二进制位进行取反操作。
异或操作是支持交换律的,异或也有一个很实用的特征就是:一个数与自身异或的结果是0。
一个数与0进行异或,结果就是它本身。
4,逗号表达式
逗号表达式,就是⽤逗号隔开的多个表达式。 逗号表达式,从左向右依次执⾏。整个表达式的结果是最后⼀个表达式的结果
逗号表达式的结果实际上是看最后一个表达式的结果,但是前面的还是要看,还是要进行计算,因为前面的表达式是会影响其他的变量的
标签:详讲,系列,符号,补码,按位,操作符,反码,原码 From: https://blog.csdn.net/daiwoliyunshang/article/details/143268730