模数和无符号整数
Modulus and unsigned integer
我发现以下行为令人惊讶:
int a = -2;
int b = 5;
uint c = 5;
std::cout << a%b << '\n';
std::cout << a%c << '\n';
Output:
-2
4
当涉及到 comparisons 时,混合有符号和无符号是有问题的 - 运算符 %
中是否存在隐藏的比较,或者这里是否发生了其他事情?
假设 uint
是一个 unsigned
类型 比 int
更窄 ,在表达式 a % c
的计算中, a
转换为 uint
并且它将具有值 -2 + std::numeric_limits<uint>::max() + 1
.
对于 32 位 uint
,该数字为 4294967294,其模 5 为 4。
对于 16 位 uint
,该数字为 65534,其模 5 再次为 4。
我发现以下行为令人惊讶:
int a = -2;
int b = 5;
uint c = 5;
std::cout << a%b << '\n';
std::cout << a%c << '\n';
Output:
-2
4
当涉及到 comparisons 时,混合有符号和无符号是有问题的 - 运算符 %
中是否存在隐藏的比较,或者这里是否发生了其他事情?
假设 uint
是一个 unsigned
类型 比 int
更窄 ,在表达式 a % c
的计算中, a
转换为 uint
并且它将具有值 -2 + std::numeric_limits<uint>::max() + 1
.
对于 32 位 uint
,该数字为 4294967294,其模 5 为 4。
对于 16 位 uint
,该数字为 65534,其模 5 再次为 4。