gpt4 book ai didi

c - 按位左移运算符分配加法

转载 作者:太空宇宙 更新时间:2023-11-04 03:35:26 24 4
gpt4 key购买 nike

这里有一个关于逻辑右移运算符的线程,但我还没有找到任何关于逻辑左移运算符的线程。我的问题是针对任何字长为 w 的固定字长语言, 整数常量 0 <= c < w和变量 int xint y , 是真的吗

(x+y)<<c = (x<<c) + (y<<c)

?

看起来这应该是正确的,因为所有加法进位都向左移动,所以向左移动应该只会在两边丢失相同的位序列。

如果 c >= w 关系是否为真?

原来我想通了。这是证据

证明

让字长w是任意的。选择任意两个有符号变量 int xint y在这个字长内,让整数常量c满足0 <= c < w .定义两个新变量 int xW2int yW2这样它们就可以存储长度为 2*w + 1 的位序列.复制 x 的位序列和 y进入xW2yW2这样 xW2 = xyW2 = y ,即它们具有相等的值。然后 xW2 << cyW2 << c不要溢出。此外(xW2<<c) + (yW2<<c)也不会溢出。但生成的位序列与 xW2 + yW2 相同与 c 0 附加到该总和的最低有效位。因此(xW2 + yW2)<<c = (xW2<<c) + (yW2<<c) .这是因为通过 w-bits 截断了两个位序列。不违反平等,所以它一定是(x+y)<<c = (x<<c)+(y<<c) .这就是所有人。

最佳答案

is it true that (given 0 <= c < w) int x,y; (x+y)<<c = (x<<c) + (y<<c)?

如果c < w是真的 x+y不会溢出,(x+y)<<c 也不会溢出, x<<c , y<<c溢出,这是真的,因为这是一个简单的 2 的幂的结合乘法。

否则没有。由于移动有符号整数而溢出是未定义的行为。将数字移入 UB 中的符号位。添加溢出是UB。

If the value of the right operand is negative or is greater than or equal to the width of the promoted left operand, the behavior is undefined. C11 §6.5.7 3

An example of undefined behavior is the behavior on integer overflow. C11 §3.4.3 3

关于c - 按位左移运算符分配加法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33133794/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com