整数的二进制表示和按位操作

补码

常见计算机的整数(含char)用补码表示,对于无符号整数和正整数无需多说,但是负整数的二进制表示即其按位操作容易引起疑惑。
原码直观,可加减法的实现不同;反码可将减法用加法实现;补码综合各种优点,所以计算机基本都用补码。
补码的具体选用历史和应用逻辑有些复杂,初学者记住即可用。后续要理解,从模的角度才不易被误导。
负正数的补码来源——反码+1中为啥要+1?因为反码不是直接取反,实际上反码 = 1111 - 正数原码,而模指导思想下,负数补码+正数原码=1 0000。
(唉,之前写的不少的厘清文字,因为csdn的问题未保存到,现在又将不到那么清楚了,有空再完善)

负整数的补码

负整数的补码有多种计算方式,开始我喜欢的是下面的第一种,因为过程中不需要区分符号位和数值位;正负数补码之间的转换方法相同。现在更喜欢第二种。第三种有助于对补码的直观认识,只需要用原补码相同的正整数。第二种只是在最小值-2^31时数值最高位溢出到符号位,这时不管溢出位即可

  1. 对应正整数的原码,取反+1
  2. 反码+1(注意反码与取反的不同)
  3. 按模取补再置符号位。比如-n的补码,为2^31-n的最左位置1
    其实方法一二对于负整数的补码计算来说,没啥区别。只是有时可能会怀疑二者结果不同,或者方法二存在溢出位怎么处理的疑惑(溢出丢弃即可)。

补码转原码也可反码+1.

特例-2n

设定补码1000为-8,没有反码和原码,否则补码转出来的原码是0而不对。0原码只是0000

按位运算符

不区分符号位还是数值位;
C++中除了一元运算符~,二元运算符不修改任何元,而是生成新值。

>>

常在高位补符号位,但也有补0的,取决于C++实现

<<

对于signed int的符号位也一视同仁

&

对负整数的符号位也一视同仁

应用

掩码、打开位、关闭位、切换位、检查位的值

位字段

struct {
	unsigned int a : 1;
	unsigned int b : 1;
	unsigned int c : 2;
} prnt;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值