

c语言编程,两数相乘,结果总是不对,不符合预期
source link: https://blog.popkx.com/c-programming-multiply-does-not-match-expect/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

c语言编程,两数相乘,结果总是不对,不符合预期
今天用 C 语言编程时,发现一个非常奇怪的现象:逻辑一切正常,输出却不对。采用 GDB 调试(可参考:gdb工具的使用),定位到错误,居然是乘法运算出了问题。
两个数字相乘,结果却是不正确的,始终是错误的
。
发现出问题的代码出现在:
usedSize = 0;
usedSize += pmInfo->videoSize*pmInfo->videoCnt;
usedSize += pmInfo->picSize*pmInfo->picCnt;
usedSize += pmInfo->logSize*pmInfo->logCnt;
usedSize += pmInfo->logIndexSize*pmInfo->logIndexCnt;
usedSize += pmInfo->videoIndexSize*pmInfo->videoIndexCnt;
usedSize += pmInfo->picIndexSize* pmInfo->picIndexCnt;
使用 GDB 定位到此的:
从上图可以看出, pmInfo->videoSize = 268435456,pmInfo->videoCnt= 146,二者相乘的结果应该是:
146 * 268435456 = 39191576576
但是,程序输出的结果却是 536870912
,这很奇怪。
其实发生这种现象的原因真的非常白痴,就是 数据溢出
了。以我的机器为例,在 c 语言的计算过程中,所有乘数默认都是 int
型的,268435456 显然超出了 int
型能够表示的最大数据,计算当然出错了。
这种现象在编译时,其实就能避免,一般出现这种情况时,编译器会出现 warnning
警告的。以下是一个简单的测试 demo:
#include <stdio.h>
void main()
{
unsigned long long i = 0;
i = 146*0xffffff;
printf("i: %lld\n", i);
}
执行编译:
$ gcc -o test test.c
test.c: In function ‘main’:
test.c:7:12: warning: integer overflow in expression [-Woverflow]
i = 146*0xffffff;
^
$ ./test
i: -1845493906
很明显,编译器已经提示我们 overflow 了。
开发时,我习惯先忽略 warnning
,最后再一起解决。这不是一个好习惯,我们也不该忽略它。
知道原因,解决起来其实很简单,加上强制转换符就可以了,如下:
#include <stdio.h>
void main()
{
unsigned long long i = 0;
i = 146*(unsigned long long)0xffffff;
printf("i: %lld\n", i);
}
再编译执行,发现问题已经解决了。
$ gcc -o test test.c
$ ./test
i: 2449473390
阅读更多: Linux笔记
Recommend
-
24
不忘初心,砥砺前行 作者 | 陌无崖 转载请联系授权 导语
-
12
大家都说 算法 是程序员的分水岭, 三年 技术一个坎。 我工作2年已经感觉到危机感,正准备同时这面临着两个问题了,不如蹭现在还有来得及一起去把算法练起来吧,光看可不行得练。尽可能的...
-
29
1 前言 今天来写一道leetcode的中等难度的题目,声明一下: 这不是最优解,就是常规思路 。 之所以写出来,是因为我觉得:如果你的想法比较复杂或者比较冗长,那也没关系,写出来ac了它,能绕过层层关卡...
-
29
Home Programming >Front end >Javascript JavaScript 大数相加相乘实现
-
8
请教一下关于split风格的结果数量不对的问题。 ...
-
5
LeetCode-043-字符串相乘发布于 11 月 2 日字符串相乘题目描述:给定两个以字符串形式表示的非负整数 num1 和 num2,返回 num1 和 num2 的乘...
-
2
V2EX › Python 两个占用内存大小 20G+的矩阵做相乘, 10 块 GPU gckend · 15 小时 2 分...
-
6
mpi矩阵乘法(C=αAB+βC) 最近领导让把之前安装的软件lapack、blas里的dgemm运算提取出来独立作为一套程序,然后把这段程序改为并行的,并测试一下进程规模扩展到128时的并行效率。 ...
-
6
mpi矩阵乘法:C=αAB+βC 一、主从模式的行列划分并行法 1、实现方法 将可用于计算的进程数comm_sz分解为a*b,然后将矩阵A...
-
5
本文中所有的优化策略源自 How To Optimize Gemm,感谢 Prof. Robert van de Geijn 教授及其团队的付出!❤
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK