当前位置:  开发笔记 > 编程语言 > 正文

MSVC++:无符号整数和溢出的奇怪性

如何解决《MSVC++:无符号整数和溢出的奇怪性》经验,为你挑选了1个好方法。

我有以下代码:

#include 

using namespace std;

int main(int argc, char *argv[])
{
    string a = "a";
    for(unsigned int i=a.length()-1; i+1 >= 1; --i)
    {
        if(i >= a.length())
        {
            cerr << (signed int)i << "?" << endl;
            return 0;
        }
    }
}

如果我使用完全优化在MSVC中编译,我得到的输出是"-1?".如果我在调试模式下编译(没有优化),我没有输出(预期.)

我认为标准保证无符号整数以可预测的方式溢出,因此当i =(unsigned int)( - 1)时,i + 1 = 0,并且循环条件i + 1> = 1失败.相反,测试以某种方式通过.这是一个编译器错误,还是我在某处做某些未定义的事情?



1> Andrew Sheph..:

我记得在2001年遇到这个问题.我很惊讶它仍然存在.是的,这是编译器错误.

优化者正在看到

i + 1 >= 1;

从理论上讲,我们可以通过将所有常量放在同一侧来优化它:

i >= (1-1);

因为是无符号的,所以它总是大于或等于零.

在此处查看此新闻组讨论.


是无符号的,所以它总是大于或等于零.
推荐阅读
可爱的天使keven_464
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有