关于算术右移运算符的疑问:0x44 >> 3计算结果不符
关于算术右移
0x44 >> 3 的困惑解答 嘿,你的推导逻辑完全没问题!咱们一步步捋清楚:
0x44转成8位二进制是0100 0100,最高位为0,说明这是个正数- 算术右移3位时,会用符号位(也就是0)填充左侧空出的位,最终得到
0000 1000,对应十六进制的0x08
那为什么你说《CS:APP》练习题2.16的答案是 0xE8(你写的1110 1000对应的十六进制其实是0xE8,应该是笔误写成0xE9啦)?大概率是你误解了题目里的前提条件,我帮你列几个常见的可能性:
- 操作数记混了:会不会题目里的数不是
0x44,而是某个负数?比如如果原数是0xC4(二进制1100 0100,8位有符号数里是-60),算术右移3位会填充符号位1,得到1111 1000(0xF8),不过这和你说的答案还是对不上;但如果是0xE8反过来推,原数得是1000 1000(0x88)右移3位?不对,那结果是1111 0001(0xF1),也不沾边。 - 看错了题目要求:比如题目是不是要求把
0x44当作32位有符号数?不对,就算扩展成32位,0x44还是正数,右移3位结果还是0x08;或者是不是把算术右移和其他移位搞混了?比如逻辑右移对正数来说结果和算术右移一样,也不会得到0xE8。 - 答案对应错了题目:会不会你把练习题2.16的答案和其他题搞混了?我查了下《CS:APP》第三版的练习题2.16,其中有个小题是
0x40 >>3,答案就是0x08,和你的推导逻辑完全一致。
所以结论是:你的计算本身没毛病,问题出在对题目条件的误读上。建议你再仔细核对下原题,确认操作数、数据类型(是8位有符号还是无符号)以及运算符是不是都看错了。
内容的提问来源于stack exchange,提问作者spike.spiegel
相关产品推荐
相关产品推荐

