(7 - 12) mod 24 等于 19,但在C++中等于 4294967291

(7 - 12) mod 24 equals 19 but in C++ it equals 4294967291

本文关键字:C++ 但在 4294967291 等于 mod      更新时间:2023-10-16

如果我用谷歌搜索(7 - 12) mod 24我会得到答案19.

当我这样做时C++我会得到4294967291

uint32_t hour = (7 - 12) % 24;
// hour = 4294967291

如果我尝试int32_t

int32_t hour = (7 - 12) % 24;
// hour = -5

(7 - 12) % 24是一个有符号表达式,将其分配给unsigned int会让您看到不同的结果

在 C 中%余数运算如此(7 - 12) % 24 = -5

unsigned(-5) = 4294967291 // since 4294967291 + 5 = 4294967296

虽然Google和Python使用数学模运算,但结果是19。和 19 + 5 = 24

C,Python - 模运算的不同行为(%)运算

7-12 ans 一个无符号的 int (uint32) 给出下溢。

参见http://en.wikipedia.org/wiki/Modulo_operation用于定义与编程语言有关的负数的运算符

uint32_t

无符号的,这意味着它仅限于正数。这也意味着它具有更大的范围,因为有符号字节的值可以从 -127 到 127,但无符号字节可以具有从 0-255 的值。当无符号 int 下溢时,它将返回一个大数字。

int32_t返回 -5 而不是 19 的原因是,在 C++ 和 C# 中,模运算符实际上是余数。

另请参阅Eric Lippert的博客psot,它对此进行了惊人的总结。具体说来。。。

"% 运算符不给出规范模数,它给出余数。"

同时,谷歌给出了自-123 mod 4 = 1年以来的规范模数,而不是-3,因为它在C++或C#中会如此。

模运算实际上有几种不同的可能定义,为负数产生不同的结果。C++的定义给出了表达式(7 - 12) % 24的负结果(-5),当你将负值转换为无符号值时,你会得到这个奇怪的结果。该值与要执行的操作时获得的值相同:

uint32_t x = 0;
x = x - 5;
相关文章: