我将考虑以下代码段:
int a =-9;
int m = 10;
unsigned int m1 =10;
std::cout<<a%m<<std::endl;
std::cout<<a%m1<<std::endl;
结果是:
-9
7
7很奇怪。 有人可以解释吗?
答案 0 :(得分:2)
根据C ++ 2017(n4659草稿)8 11,通常对a % m
的操作数执行算术转换。按照11.5.3,当一个操作数具有带符号整数类型而另一个操作数具有大于或等于秩的无符号整数类型时,有符号操作数将转换为无符号操作数的类型。
这将将{-9的int
值转换为unsigned
。此转换执行的模数比unsigned
的最大值(在您的实现中显然为4,294,967,295(2 32 -1))大,因此该转换以模数4,294,967,296执行,产生4,294,967,287。 (执行4,294,967,296模的转换是指根据需要将4,294,967,296加或减多次,以产生0到4,294,967,295(含)之间的结果。)
然后%
运算符将以通常的方式运行; 4,294,967,287除以10的余数为7。