gpt4 book ai didi

c - 在 C 中将整数除以 2 的幂

转载 作者:行者123 更新时间:2023-12-05 02:28:25 25 4
gpt4 key购买 nike

当尝试以两种不同的方式将整数除以 2 的幂时,我得到了两个不同的输出。一种方法是将其右移 k 位。另一种方法是除以 (1<

#include <stdio.h>

int main(void) {
int y1 = 0x00061290;
int y2 = 0xFFFE1A32;
printf("(y1/(1<<k))=%x\n", (y1/(1<<5)));
printf("(y2/(1<<k))=%x\n", (y2/(1<<5)));
printf("(y1>>k))=%x\n", (y1>>5));
printf("(y2>>k))=%x\n", (y2>>5));
return 0;
}

输出:

(y1/(1<<k))=3094
(y2/(1<<k))=fffff0d2
(y1>>k))=3094
(y2>>k))=fffff0d1

当 y1 为 0x00061290 时,该整数的输出相同。当y2为0xFFFE1A32时,该整数的输出不同。

我猜这是因为 y1 是正数而 y2 不是。但我不确定。有人能告诉我他们在什么情况下不同,在什么情况下相同吗?并尽可能解释两种操作的区别。谢谢

最佳答案

你得到不同输出的原因是 y1y2 被定义为 int 而不是 unsigned int。有符号除法向 0 舍入(自 C99 起指定),而将负值向右舍入向负无穷大在您的平台上。 C 标准指定将负值向右移动的行为是实现定义的

但是请注意,对于 %x 格式,将 int 传递给 printf 具有未定义的行为。

如果您将 y1y2 定义为 unsigned,除法和移位将产生相同的结果。

修改后的版本:

#include <stdio.h>

int main() {
unsigned y1 = 0x00061290;
unsigned y2 = 0xFFFE1A32;
printf("y1=%x, y1/(1<<k)=%x\n", y1, y1 / (1<<5));
printf("y2=%x, y2/(1<<k)=%x\n", y2, y2 / (1<<5));
printf("y1=%x, y1>>k=%x\n", y1, y1 >> 5);
printf("y2=%x, y2>>k=%x\n", y2, y2 >> 5);
printf("\n");
int i1 = 511;
int i2 = -511;
printf("i1=%d, i1/(1<<k)=%d\n", i1, i1 / (1<<5));
printf("i2=%d, i2/(1<<k)=%d\n", i2, i2 / (1<<5));
printf("i1=%d, i1>>k=%d\n", i1, i1 >> 5);
printf("i2=%d, i2>>k=%d\n", i2, i2 >> 5);
return 0;
}

输出:

y1=61290, y1/(1<<k)=3094
y2=fffe1a32, y2/(1<<k)=7fff0d1
y1=61290, y1>>k=3094
y2=fffe1a32, y2>>k=7fff0d1

i1=511, i1/(1<<k)=15
i2=-511, i2/(1<<k)=-15
i1=511, i1>>k=15
i2=-511, i2>>k=-16

关于c - 在 C 中将整数除以 2 的幂,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72612135/

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