c语言左移问题
书本上说无符号的二进制整数左移n位就等价于这个这个二进制整数乘以2的n次幂,但左移概念不是左边去掉n个二进制位,右边补n个零吗,这是不是有点矛盾?例如:00010010(...
书本上说无符号的二进制整数左移n位就等价于这个这个二进制整数乘以2的n次幂,
但左移概念不是左边去掉n个二进制位,右边补n个零吗,这是不是有点矛盾?
例如:0001 0010(十进制为18)左移4位,
得到的应该是0010 0000(十进制32),但是18*16≠32
当左移左边不去零,右边单纯补零的时候得到0001 0010 0000,这时候得到的恰好是
288=18*16,但这只是单纯往左移了
又比如:0000 0111(十进制7),左移四位,
得到0111 0000(十进制112),这时候符合7*16=112
也就是说左移n位等价于乘以2的n次幂是不是有条件?
我在做题目的时候(题目是将一个无符号数的二进制数高低四位互换)
比如说194,他的二进制数是1100 0010
那我想得到的是0010 1100(十进制44)
我用左移的时候194<<4,得到的不是0010 0000,而是1100 0010 0000,这算溢出了吗? 展开
但左移概念不是左边去掉n个二进制位,右边补n个零吗,这是不是有点矛盾?
例如:0001 0010(十进制为18)左移4位,
得到的应该是0010 0000(十进制32),但是18*16≠32
当左移左边不去零,右边单纯补零的时候得到0001 0010 0000,这时候得到的恰好是
288=18*16,但这只是单纯往左移了
又比如:0000 0111(十进制7),左移四位,
得到0111 0000(十进制112),这时候符合7*16=112
也就是说左移n位等价于乘以2的n次幂是不是有条件?
我在做题目的时候(题目是将一个无符号数的二进制数高低四位互换)
比如说194,他的二进制数是1100 0010
那我想得到的是0010 1100(十进制44)
我用左移的时候194<<4,得到的不是0010 0000,而是1100 0010 0000,这算溢出了吗? 展开
展开全部
但左移概念是左边去掉n个二进制位,右边补n个零,但这是指原来的二进制数是“机器数”。就是如果使用unsigned char 来存储这个数的话,就是这样的。
例如:0001 0010(十进制为18)左移4位,
得到的应该是0010 0000(十进制32),但是18*16≡32 (模256)
当左移左边不去零,右边单纯补零的时候得到0001 0010 0000,这时候得到的恰好是
288=18*16,但这只是单纯往左移了(“丢失”了移出的4位)
如果仍是存储在unsigned char 中的话,就仍是0010 0000(十进制32)
用左移的时候194<<4,是1100 0010 0000,若仍是存储在unsigned char 中的话,就仍是0010 0000,这就是溢出了。
例如:0001 0010(十进制为18)左移4位,
得到的应该是0010 0000(十进制32),但是18*16≡32 (模256)
当左移左边不去零,右边单纯补零的时候得到0001 0010 0000,这时候得到的恰好是
288=18*16,但这只是单纯往左移了(“丢失”了移出的4位)
如果仍是存储在unsigned char 中的话,就仍是0010 0000(十进制32)
用左移的时候194<<4,是1100 0010 0000,若仍是存储在unsigned char 中的话,就仍是0010 0000,这就是溢出了。
追问
谢谢,我再试试
展开全部
前提当然是不考虑溢出问题,一个字节根本不能表示超过255的数据,自然会溢出
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
这里存在一个溢出的问题,但如果不考虑溢出的问题,书上的结论说法没有问题。这就是理论与实现的差距,具体问题需要具体分析。
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询