在算术右移(ASR)期间,MSB被复制到左边,因此符号保持不变-这是很清楚的。然而,在算术左移(ASL)中,符号在某些情况下可能会丢失,例如
01001001 << 1 = 10010010最初的数字显然是正数,因为MSB是0,但移位后的数字是负数,因为MSB是1。您能解释一下为什么会这样吗?
发布于 2014-03-05 02:51:42
与右移位不同的是,与“逻辑左移”相比,并没有真正的“算术左移”,只有一种左移,而且它丢弃了符号。
真的,它无能为力。那些左移改变符号的情况,恰恰是那些“实际结果”不能用你有多少位来表达的情况。
发布于 2014-03-05 03:08:26
对于2的补码二进制值,导致负值变为正值的左移只是一个翻转条件。操作的结果是溢出。使用更大的整数类型。如果您使用的是1的补码表示法,那么首先将其转换为2的补码值,然后进行移位并将其转换回来。
发布于 2015-04-27 05:27:35
在“算术左移”中,使用有符号的值(任何位值大小(8,16等)),这只是一个逻辑左移(乘以2),它会给你一个正确的结果,除非主位总线改变(1=>0或0=>1)是溢出(/underflow)或错误(未定义的结果)条件。
有些处理器会设置溢出或错误标志,以便您进行测试,否则您必须以编程方式自己进行测试。
对于无符号值,无论何时在移位后设置进位位,它都是溢出。(注意任何左移位指令,这些指令不会移入进位,而只是丢弃MSB)
https://stackoverflow.com/questions/22180372
复制相似问题