gpt4 book ai didi

c++ - 为什么在 C++ 中混合 size_t 和 unsigned int 时模除法会出错

转载 作者:行者123 更新时间:2023-12-03 21:05:15 26 4
gpt4 key购买 nike

给定一个程序

#include <iostream>
using namespace std;

int main()
{
const size_t DoW = 7;
const unsigned int DAYS_OF_WEEK = static_cast<unsigned int> (DoW);
unsigned int dayOfFirstDay = 0;
unsigned int _firstDayOfWeek = 1;
unsigned int diff = (DAYS_OF_WEEK+ (dayOfFirstDay - _firstDayOfWeek) ) % DAYS_OF_WEEK;
cout << "diff = (" << DAYS_OF_WEEK << " + (" << dayOfFirstDay << " - " << _firstDayOfWeek << ")) %" << DAYS_OF_WEEK
<< " = " << diff << endl;
return 0;
}
该程序的输出是
diff = (7 + (0 - 1)) %7 = 6
这是预期的。但是一个没有 static_cast 的修改过的程序
#include <iostream>
using namespace std;

int main()
{
const size_t DAYS_OF_WEEK = 7;
unsigned int dayOfFirstDay = 0;
unsigned int _firstDayOfWeek = 1;
unsigned int diff = (DAYS_OF_WEEK+ (dayOfFirstDay - _firstDayOfWeek) ) % DAYS_OF_WEEK;
cout << "diff = (" << DAYS_OF_WEEK << " + (" << dayOfFirstDay << " - " << _firstDayOfWeek << ")) %" << DAYS_OF_WEEK
<< " = " << diff << endl;
return 0;
}
产出
diff = (7 + (0 - 1)) %7 = 3
这是意料之中的。为什么?
(这两个程序都是在 Ubuntu 64 位上使用 g++ 9.3.0 编译的)

最佳答案

在您的平台上,size_t 似乎是 64 位,而 unsigned int 是 32 位。
64位1没有integral promotion。这是在表达式中混合 64 位操作数的危险。
因此,当转换为 64 位时,-1 的 32 位环绕保留为 4294967295。
我们得到 7 + 4294967295(以 64 位执行)= 4294967302(无环绕)。
4294967302 % 7 = 3

1 除了 ( unsigned ) int 本身是 64 位的系统,这目前不太可能。

关于c++ - 为什么在 C++ 中混合 size_t 和 unsigned int 时模除法会出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67567985/

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