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,这算溢出了吗?
展开
 我来答
听不清啊
高粉答主

2018-10-22 · 说的都是干货,快来关注
知道顶级答主
回答量:7.8万
采纳率:89%
帮助的人:1.9亿
展开全部
但左移概念是左边去掉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,这就是溢出了。
追问
谢谢,我再试试
shine1991
科技发烧友

2018-10-21 · 智能家居/数码/手机/智能家电产品都懂点
知道顶级答主
回答量:4.7万
采纳率:82%
帮助的人:2.3亿
展开全部
前提当然是不考虑溢出问题,一个字节根本不能表示超过255的数据,自然会溢出
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
cylz0703
2018-10-21 · TA获得超过3.4万个赞
知道大有可为答主
回答量:1.8万
采纳率:83%
帮助的人:4441万
展开全部
这里存在一个溢出的问题,但如果不考虑溢出的问题,书上的结论说法没有问题。这就是理论与实现的差距,具体问题需要具体分析。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式