SQ
实验目的
代码总览
#include <stdio.h>
#include <stdlib.h>
int sq(int x) {
return x*x;
}
int main(int argc, char *argv[])
{
int i;
for (i = 1; i < argc; i++)
{
int x = atoi(argv[i]);
int sx = sq(x);
printf("sq(%d) = %d\n", x, sx);
}
return 0;
}
代码分析
- 主函数中调用函数
sq
进行乘法运算,定义int型变量录入结果。
编译运行
- 运行结果
结果分析
- 当操作指令为
./a.out 65535
时,输出结果应为正数,但结果却是-131071
。这是因为int型数据是32位,表数在-2147483648(-2^31) ~2147483647(2^31)范围内,而65535的平方结果是4294836225>2147483647,故发生了溢出。乘法运算后所得机器码是1111 1111 1111 1110 0000 0000 0000 0000,符号位为1,在计算机中为负数,数值为-131071。 - 机器中都是进行数学运算,都是先将数值转化为二进制再进行运算,运算数值超过类型表数范围会发生溢出(主要是因为机器码被截断),类型分为正溢出和负溢出。
- 解决手段:可将sx定义为double型,表数范围更大。