gpt4 book ai didi

c - 为什么当变量被替换为它正在计算的内容时,这个表达式的输出是不同的?

转载 作者:太空宇宙 更新时间:2023-11-04 08:07:20 25 4
gpt4 key购买 nike

这是代码段。它正在执行 x/2^n , 向 0 舍入。第一个 print 语句计算出正确的值(在本例中为 -7),但第二个语句,即第一个带有 bias 的语句替换为 ((x>>31) & ((1<<n)+0xffffffff)) (无论如何计算偏差)并产生 9。这是怎么回事?

#include <stdio.h>

int main(void) {
int x = 0x80000004;
int n = 0x1c;
int bias = ((x>>31) & ((1<<n)+0xffffffff));
printf("%d\n", (x + bias) >> n);
printf("%d\n", (x + ((x>>31) & ((1<<n)+0xffffffff))) >> n);
return 0;
}

最佳答案

表达式 x + biasx + ((x>>31) & ((1<<n)+0xffffffff))有不同的类型;第一个是 int , 第二个unsigned int .接线员>>保留 int 的符号位s,但不适用于 unsigned秒。 (编译器不必这样做,但它可能这样做。)为了清楚地看到发生了什么,我稍微扩展了代码:

#include <stdio.h>

int main(void) {
int x = 0x80000004;
int n = 0x1c;
int bias = ((x>>31) & ((1<<n)+0xffffffff));
printf("%d\n", (x + bias) >> n);
printf("%d\n", (x + ((x>>31) & ((1<<n)+0xffffffff))) >> n);
printf("%d\n", (x + (int)((x>>31) & ((1<<n)+0xffffffff))) >> n);

printf ("(int) %d\n", x + bias);
printf ("(unsigned) %u\n", x + ((x>>31) & ((1<<n)+0xffffffff)));

return 0;
}

输出是:

-7
9
-7
(int) -1879048189
(unsigned) 2415919107

关于c - 为什么当变量被替换为它正在计算的内容时,这个表达式的输出是不同的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41885348/

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