运行算法时,输入的整数默认显示为计算机系统中的有符号整数。 如果有符号整数的算术移位,则根据补数的移位规则进行移位。 在有符号整数进行比特运算“左移()”的情况下,规则为“符号比特不变更,移位废弃,空出0”。 在有符号整数进行比特运算“右移位()”的情况下,规则为“不变更编码比特,丢弃移位,使比特互补编码比特为空”。
在有符号整数的二进制表示中,最高有效比特为已编码比特(正整数编码比特为0,负整数编码比特为1 )也来自有符号整数名称。
有符号正数移位规则:
1 .原码无论是向左移动还是向右移动,编码位都不变,舍弃移位,空出0
2 .反符号,无论是向左移动还是向右移动,编码比特都不变。 移动并丢弃位,空出位互补0
3 .补码,无论是左移还是右移,编码比特不变。 放弃位移,空出0
带符号负数移位规则:
1 .原码无论是向左移动还是向右移动,编码位都不变,舍弃移位,空出0
2 .反符号,无论是向左移动还是向右移动,编码比特都不变。 移动并丢弃位,空出位补1
3 )如果移动到补充数,则已编码比特未被改变且移动比特被丢弃,空闲比特补充0; 在右移位的情况下,编码比特不变,移位被废弃,空闲比特补充1
向左移动的特殊情况:
左移的一个特殊情况是,如果左移的位数超过该数值类型的最大位数,编译器就会用左移的位数删除该类型的最大位数,并用馀数进行移位。 例如:
int i=1; //int为32位
i=i33; //332=1,左移1位,I变为2
原码、反码、补码:
正数的反码等于其原码
正补数等于其原始代码
负数的反码等于反转了负数的除原始已编码比特之外的每个比特(0变为1,1变为0 ) )。
负数的补数与负数的反转数加1相同。