首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何防止算术左移(ASL)中的符号丢失

如何防止算术左移(ASL)中的符号丢失
EN

Stack Overflow用户
提问于 2014-03-05 02:48:04
回答 3查看 777关注 0票数 0

在算术右移(ASR)期间,MSB被复制到左边,因此符号保持不变-这是很清楚的。然而,在算术左移(ASL)中,符号在某些情况下可能会丢失,例如

代码语言:javascript
复制
01001001 << 1 = 10010010

最初的数字显然是正数,因为MSB是0,但移位后的数字是负数,因为MSB是1。您能解释一下为什么会这样吗?

EN

回答 3

Stack Overflow用户

发布于 2014-03-05 02:51:42

与右移位不同的是,与“逻辑左移”相比,并没有真正的“算术左移”,只有一种左移,而且它丢弃了符号。

真的,它无能为力。那些左移改变符号的情况,恰恰是那些“实际结果”不能用你有多少位来表达的情况。

票数 2
EN

Stack Overflow用户

发布于 2014-03-05 03:08:26

对于2的补码二进制值,导致负值变为正值的左移只是一个翻转条件。操作的结果是溢出。使用更大的整数类型。如果您使用的是1的补码表示法,那么首先将其转换为2的补码值,然后进行移位并将其转换回来。

票数 0
EN

Stack Overflow用户

发布于 2015-04-27 05:27:35

在“算术左移”中,使用有符号的值(任何位值大小(8,16等)),这只是一个逻辑左移(乘以2),它会给你一个正确的结果,除非主位总线改变(1=>0或0=>1)是溢出(/underflow)或错误(未定义的结果)条件。

有些处理器会设置溢出或错误标志,以便您进行测试,否则您必须以编程方式自己进行测试。

对于无符号值,无论何时在移位后设置进位位,它都是溢出。(注意任何左移位指令,这些指令不会移入进位,而只是丢弃MSB)

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22180372

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档