gpt4 book ai didi

不能在 c 中向右移动负数

转载 作者:行者123 更新时间:2023-12-01 07:51:19 25 4
gpt4 key购买 nike

我正在学习“K&R 的 C 语言”。现在我正在做按位部分。我很难理解以下代码。

int mask = ~0 >> n;

我正在使用它来掩盖另一个像这样的二进制文件的左侧。
0000 1111
1010 0101//随机数

我的问题是,当我打印 var 掩码时,它仍然为负 -1。假设 n 是 4。我认为将 ~0 转换为 -1 将是 15 (0000 1111)。

谢谢你的回答

最佳答案

对负值执行右移会产生实现定义的值。大多数托管实现将转移到 1左边的位,正如你在你的例子中看到的那样,但不一定是这种情况。

无符号类型以及有符号类型的正值总是在 0 中移动右移时左边的位。因此,您可以通过使用无符号值来获得所需的行为:

unsigned int mask = ~0u >> n;

此行为记录在 C standard 的第 6.5.7 节中。 :

5 The result of E1 >> E2 is E1 right-shifted E2 bit positions. If E1 has an unsigned type or if E1 has a signed type and a nonnegative value, the value of the result is the integral part of the quotient of E1 / 2E2 .If E1 has a signed type and a negative value, the resulting value is implementation-defined.

关于不能在 c 中向右移动负数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49396937/

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