【发布时间】:2021-05-17 10:32:23
【问题描述】:
给定一个程序
#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 编译)
【问题讨论】:
-
DAYS_OF_WEEK具有不同的类型,因此环绕会导致不同的数字,在两个版本中都打印DAYS_OF_WEEK+ (dayOfFirstDay - _firstDayOfWeek)。 -
unsigned int可以拥有的最大数字是4,294,967,295,因此如果您使用unsigned int作为您的数据类型,0-1的计算结果就是该值。还有( 7 + ( 4294967295 ) ) % 7 == 3。 -
@alle_meije -- 整数类型可以表示的值范围取决于编译器。 C 和 C++ 标准只要求
unsigned int足够大以表示从 0 到 65,535 的值,即 16 位。现在许多编译器都支持更大的范围,4,294,967,295 是 32 位无符号整数的上限。上限远大于 64 位无符号整数的上限。您的分析对于 32 位整数是正确的。
标签: c++ static-cast