gpt4 book ai didi

c++ - 如果表达式的中间结果溢出,是否是未定义行为?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:15 24 4
gpt4 key购买 nike

这个问题是另一个SO question的结果.

示例代码

#include <iostream>

int main()
{
unsigned long b = 35000000;
int i = 100;
int j = 30000000;
unsigned long n = ( i * j ) / b; // #1
unsigned long m = ( 100 * 30000000 ) / b; // #2
std::cout << n << std::endl;
std::cout << m << std::endl;
}

输出

85
85

使用 g++ -std=c++11 -Wall -pedantic -O0 -Wextra 编译此代码会给出以下警告:

9:28:警告:表达式 [-Woverflow] 中的整数溢出

问题

  1. 我认为 #1#2 调用未定义行为是否正确,因为中间结果 100 * 30000000 没有适合int?还是我看到的输出定义明确?

  2. 为什么我只收到带有 #2 的警告?

最佳答案

是的,这是未定义的行为,如果 unsigned long 是 64 位类型,您得到的结果通常是不同的。

¹ 这是 UB,因此无法保证。

关于c++ - 如果表达式的中间结果溢出,是否是未定义行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12488522/

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