c&c++、补码、移位

二进制数在计算机内存储的是其补码,对于有符号数,正数的补码和本身一样,负数的补码是本身的数字位取反后加1,比如:1=(0001) 补=(0001),-1=(1001) 补=(1111),计算机存储-1就是存储的1111。
16位对应的有符号数,取值范围-8000~7FFF(-32768~32767)。-8000=(1000 0..0),其补码=(7FFF+1==8000),32767+5==-0x8000+4==-32764; -32768-5==0x7FFF-4==32763;
int stringify = 0x80000000; stringify >> 24;得到的结果为0xFFFFFF80, 有符号数移位最高位回填,无符号数移位回填0。
无符号数0 - 1==0xFF;不会变成负数。
u16Value = (pu8Data[1] << 8) + pu8Data[0]; 取高位放到高位,低位放到低位
VOS_VOID EMAP_SetHostU16(VOS_UINT16 u16Value, VOS_UINT8 *&pu8Data);
get后面的变量得到前面指向的数据,前面的自偏移,set 后面的指向的内容得到前面变量数据,后面的自偏移

1.为什么要使用原码,反码,补码
1)负数二进制怎么表示?
答:在原码中,高位为1就表示负数
2)计算机如何实现减法?
1-1=?
答:对于计算机,逻辑运算应该设计的简单,1-1可以表示为1+(-1),故没有减法,用加法实现减法。
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

3)0的二进制怎么表示,+0和-0有区别吗?
答:+0和-0,但是补码都为0,计算机中使用的是补码,故计算机中无+0和-0区分

理由:
+0的原码,反码,补码,都是00000000
-0的原码是10000000反码是11111111 ,而补码是00000000
补码解决了0的符号的两个编码的问题:
1-1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原
= [0000 0001]补 + [1111 1111]补 = [0000 0000]补=[0000 0000]原=0

4)8位,-128的原码是多少?
答:-128没有原码,原码的表示范围为[-127, +127],
计算机用补码表示,由于去掉了-0, [1000 0000]补 就是-128. 可以表示用来表示最小值-128,补码的表示范围为[-128, 127]
2.为什么左移是逻辑运算,右移是算术运算
左移是逻辑运算,右移是算术运算
逻辑移位是连标志位(正负号)一起操作的,所以可能会改变正负号。
而算术移位是固定好标志位,移动其他的位,不会改变正负号,但前面被移动的位是补0还是补1,如果标志位是1,则都补1,是0,则都补0。
答:如果负数右移补0,一是负数变为了正数,补1的话,由于计算机都是补码表示,由于恰到好处
3.左移等于*2,右移等于/2,对负数也适合吗
答:是适合的,原来理解错误,是由于从原码角度考虑了,没有从补码角度考虑,计算机是用补码进行运算的。输出的进制数也是补码。
本例int是32位,4字节,所以16进制共8位
温馨提示:内容为网友见解,仅供参考
第1个回答  2022-07-29
对。
你说什么都对。

c&c++、补码、移位
答:-128没有原码,原码的表示范围为[-127, +127],计算机用补码表示,由于去掉了-0, [1000 0000]补 就是-128. 可以表示用来表示最小值-128,补码的表示范围为[-128, 127]2.为什么左移是逻辑运算,右移是算术运算 左移是逻辑运算,右移是算术运算 逻辑移位是连标志位(正负号)一起操作的,...

请教C++中移位运算符的一道问题,详解please!
在计算机中,数是以 二进制补码 形式存放的,正数 和零的补码为 原码 本身,负数的补码是符号位不变,其余每位 取反 加1 额~~

在c++位运算里什么是左移位和右移位
1.在c++中,移位运算符有双目移位运算符:<<(左移)和(右移)。移位运算符组成的表达式也属于算术表达式,其值为算术值。2.左移运算是将一个二进制位的操作数按指定移动的位数向左移位,移出位被丢弃,右边的空位一律补0。3.右移运算是将一个二进制位的操作数按指定移动的位数向右移动,移出位...

在c\/c++,"index<<=1”, "index |= 1” ,其中"<<=" 、"|=1"不是什么意...
两个都是赋值的符号了,<<=是先把index 左移1位 (例如index=00000001,经过左移一位后得index=00000010)再把它赋给index,|=1是先把index与1进行 位与运算 后再赋给index。希望对你有帮助,至于具体怎么用,自己根据我的说法去查资料吧。都是C语言的基本运算符里面的知识了 ...

“移位运算符在移位操作中,无论左移还是右移,所移出的空位一律补0”这...
2、在c++中,移位运算符有双目移位运算符:<<(左移)和>>(右移)。移位运算符组成的表达式也属于算术表达式,其值为算术值。3、首先要明白一点,这里面所有的操作都是针对存储在计算机中中二进制的操作,那么就要知道,正数在计算机中是用二进制表示的,负数在计算机中使用补码表示的。左移位:<<,...

移位运算怎么计算
在使用补码作为机器数的机器中,正数的符号位为0,负数的符号位为1。在移位运算时,byte、short和char类型移位后的结果会变成int类型,对于byte、short、char和int进行移位时,编译器未做任何优化的情况下(优化后不可预期),规定实际移动 的次数是移动次数和32的余数,也就是移位33次和移位1次得到的...

计算机基础二进制补码与移位运算
计算机基础二进制补码与移位运算 在计算机系统中,数字,一律采用补码表示和存储。八位补码,与其代表数字的对应关系,如下表所示。由图可见,数字与补码的转换,十分简单。--- 二进制补码移位:移动一位,就是乘(除)以二。向左移位,很简单了。向右移位,就要保持最高位不变。

如何成为编程高手
【一】如何成为电脑高手 要掌握的知识包括: 电脑基础---对计算机硬件、体系结构不了解是不行的。另外像二进制、十六进制、补码、位运算(与、或、非、移位) 编程语言---有人你说 C\/C++,有人说 Java,还有人说别的。还是要看将来会用什么。数据类型、顺序控制、子程序、函数等概念,多数编程语言...

关于C语言的基础问题。(位运算、补码)
补码是现在最常用的一种数据编码方式,对于无符号数,补码和其值是一样的,而对于有符号数有点区别。补码表示有符号数时,第一位表示正负号,1为-,0为+,所以i是0xFFFFFF,全部为1,则i为负数,当其为负数时,值的求法是去掉符号位,剩下的取反+1,那么就是0+1=1,所以i的值是-1 要理解...

...0000左移一位得到的值是多少,溢出的1是补码还
那要看你把二进制数1000 0000赋什么类型的变量:1.赋给char型变量时,左移一位得到的值是0000 0000;2.赋给int型变量时,左移一位得到的值是10000 0000;3.赋给long、unsigned型变量时,左移一位得到的值也是10000 0000;4.C\/C++中的整数都是补码。

相似回答