(7 - 12) mod 24 等于 19,但在C++中等于 4294967291
(7 - 12) mod 24 equals 19 but in C++ it equals 4294967291
如果我用谷歌搜索(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;
相关文章:
- 代码在main()中运行,但在函数中出现错误
- 链接阶段在Ubuntu上失败,但在MacOS上失败
- 对C宏的未定义引用,但在定义它时会出现重新定义错误
- c++17文件系统::recursive_directory迭代器()在mac上没有给出这样的目录,但在windows上
- 断言中的Fold表达式在某些计算机上编译,但在其他计算机上不编译
- 换位表导致测试失败(但在游戏中运行良好)
- 库标题在标题中不可见,但在 cmake build 下.cpp文件中完全可见.为什么?
- 树莓上的 Libtorch 无法加载 pt 文件,但在 ubuntu 上工作
- 在成员dynamic_bitset上使用 boost::from_block_range 时出错,但在本地dynamic
- 编译在我的 Mac 上工作,但在集群 (Linux) 上不起作用
- 我编写了代码将十进制分数转换为其二进制等效数.它编译得很好,但在执行时挂起
- 我的代码运行良好,但在游戏循环中中断
- C++ assigment std::list:<typename>:itrator 在 main 中工作,但在方法中它不起作用
- C++代码在台式机上工作正常,但在笔记本电脑上则不行
- 实现 DFS 在较短的输入下工作正常,但在较大的输入下会抛出分段错误
- 点云库在VS 2019中不起作用,但在VS 2017中确实有效
- C++ Python 模块在 Blender 中崩溃,但在 Python 控制台中不会崩溃
- 分段 Linux Ubuntu 中的 g++ 错误,但在 Windows 中的 g++/MingW 中,在 C++ 中打
- 为什么数组大小信息可用于"sizeof"运算符和 delete[] 运算符,但在将数组作为参数传递到
- 如何处理没有默认构造函数但在另一个构造函数中构造的对象?