c - Unsigned long long 不同的结果
问题描述
为什么我得到:
34458730320
3446590374
如果我运行:
#include <stdio.h>
int main()
{
printf("%llu\n",10248428203192896360LLU/594823321LLU*2LLU);
printf("%llu\n",2LLU*10248428203192896360LLU/594823321LLU);
return 0;
}
我预计第二个是正确的(在 Mathematica,Matlab 中检查)。
解决方案
整数值
2LLU * 10248428203192896360LLU
溢出 64 位,编译器应该对此发出警告。第一个是正确的
10248428203192896360LLU / 594823321LLU * 2LLU
因为除法是精确的,没有余数,所以除法后加倍没有关系。
推荐阅读
- r - R:除了一个单元格之外有唯一的行,如何获得保持差异的唯一行
- android - 在android中的viewmodel中扭曲MVP演示者?
- postgresql - 更改 solr 存储日期和时间的方式
- c# - 在 asyc 方法中抛出新异常
- google-chrome-extension - Chrome 扩展开发试图使字体加粗
- c++ - 警告 C26454:算术溢出:“-”操作在编译时产生负的无符号结果 (io.5)
- sql-server - 带有过滤器的 SQL Server 分组依据
- javascript - 如何从 JSON.stringify 中正确提取数据
- python - 将列中所有时间条目的时间格式从小时更改为上午/下午
- c# - C# GetWindowModuleFileName 和 GetWindowText 给出不同句柄的结果