gpt4 book ai didi

c - 这是一个 VC 编译器错误吗?关于无符号整数包装

转载 作者:太空狗 更新时间:2023-10-29 17:23:43 25 4
gpt4 key购买 nike

我认为下面的 C 程序应该输出 1:

#include <stdio.h>
int main()
{
unsigned int n=18u;
while ((n+17u)>=17u) n-=17u;
printf("%u\n",n+17u);
return 0;
}

但在VC6、Visual Studio 2010或Visual Studio 2012中编译,都是 Release模式,程序不输出任何东西,也不退出。

这是VS2012生成的汇编代码:

00BD1000  mov         eax,12h
00BD1005 lea eax,[eax-11h]
00BD1008 jmp main+5h (0BD1005h)

看来是编译器做了一些优化,产生了死循环。

我认为 ((n+17u)>=17u) 并不总是正确的,因为如果 n==0xFFFF..FFn+ 17u 将换行到 16u

是我错了,还是编译器错了?

最佳答案

gccclang 都编译掉那个循环,用常量 1 的 printf 替换它(使用 -O3.)

我认为您观察到的 VC 行为是一个错误:无符号算术定义明确,并且您认为溢出应该回绕到小于 17 的整数是正确的。因此 gccclang 做对了。

关于c - 这是一个 VC 编译器错误吗?关于无符号整数包装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19892440/

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