none
请教一下,运行代码分析(Code analysis)后,提示有warning 26451,这个C26451说的溢出到底是怎么算的? RRS feed

答案

  • 这个警告是完全正确的。因为 = 是赋值运算符,因此首先调用的是 + 运算符函数,函数原型是 “int operator+(int, int)”。很显然如果两个 int 相加之后的值大于 int 的最大值时其结果将溢出,由于 = 赋值是在 + 运算符函数计算出结果之后进行的,且类型转换是在赋值时才发生,因此最终您将得到一个溢出后的错误结果,尽管最终类型是 long long,但这个算式的结果仍然是溢出的。这个警告的意思就是让您确认这是否是设计本意,如果您的本意是想得到 2147483648 + 10 = 2147483658 这样一个算式结果,那 “unsigned long long = int + unsigned short” 这样一个表达式就会出现问题,因为结果不会是 2147483658,而是 18446744071562067978 这样一个溢出值。

    而且您要是仔细看就会发现提示信息的红线不包括等号和其左侧的部分,警告的部分只是 + 运算这一部分,另外提示文本也很清楚地写着“在被分配到更广的类型之前子表达式可能溢出”。

    补充:溢出的意思是结果将超出数值的最大值,不是指溢出内存。

    • 已编辑 [-] 2021年1月22日 11:45
    • 已标记为答案 凤凰与梧桐 2021年1月25日 1:54
    2021年1月22日 11:41

全部回复

  • 你好,

    感谢您在MSDN中文论坛发帖提问。

    该检查使用一种启发式方法,该方法在执行整数运算以防止溢出时会查看结果类型。由于最终结果将是8个字节,因此建议将4个字节的操作也转换为8个字节。

    我建议你将变量的类型更改为“ unsigned __int64”。

    Best Regards,

    Jeanine


    "Visual c++" forum will be migrating to a new home on Microsoft Q&A !
    We invite you to post new questions in the "Developing Universal Windows apps" forum’s new home on Microsoft Q&A !
    For more information, please refer to the sticky post.

    2021年1月21日 2:50
    版主
  • 感谢回复。

    一个四字节的整型,执行“+”操作,无论这个四字节的整型有多大,它都不可能会让8字节的变量保存不了吧?

    基于上述考虑,截图中的警告是否是“错误”的提示呢?

    2021年1月22日 9:42
  • 这个警告是完全正确的。因为 = 是赋值运算符,因此首先调用的是 + 运算符函数,函数原型是 “int operator+(int, int)”。很显然如果两个 int 相加之后的值大于 int 的最大值时其结果将溢出,由于 = 赋值是在 + 运算符函数计算出结果之后进行的,且类型转换是在赋值时才发生,因此最终您将得到一个溢出后的错误结果,尽管最终类型是 long long,但这个算式的结果仍然是溢出的。这个警告的意思就是让您确认这是否是设计本意,如果您的本意是想得到 2147483648 + 10 = 2147483658 这样一个算式结果,那 “unsigned long long = int + unsigned short” 这样一个表达式就会出现问题,因为结果不会是 2147483658,而是 18446744071562067978 这样一个溢出值。

    而且您要是仔细看就会发现提示信息的红线不包括等号和其左侧的部分,警告的部分只是 + 运算这一部分,另外提示文本也很清楚地写着“在被分配到更广的类型之前子表达式可能溢出”。

    补充:溢出的意思是结果将超出数值的最大值,不是指溢出内存。

    • 已编辑 [-] 2021年1月22日 11:45
    • 已标记为答案 凤凰与梧桐 2021年1月25日 1:54
    2021年1月22日 11:41