CSAPP学习日志2:Sq
程序员文章站
2022-06-29 18:58:10
...
代码全览
#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;
}
测试结果如下:
由图可以看出:①当./a.out后不带参数时,没有输出结果,是因为./a.out后不带参数时不满足for循环的条件;
②在我们的认知中,实数的平方应该总是≥0,而程序在计算65535的平方时结果却是一个负数,原因是:c语言中int类型的数据的表数范围在-2147483648(-2的31次方)~2147483647(2的31次方-1),而65535的平方应是4294836225>2147483647,产生了溢出,int型数据在机器中占32位,所以4294836225在改程序下的机器级表示为:1111 1111 1111 1110 0000 0000 0000 0000,最高位为1,被解释成负数,负数在机器中是补码表示,其数值为-131071;
③当程序计算500000的平方时,虽然答案是正数,但却不是正确的答案,原因是:500000的平方结果为250000000000>2147483647,同样是产生了溢出,在该程序下,250000000000的机器级表示为:0011 0011 0000 1101 0100 0100 0000 0000,最高位是0,被解释成正数,其值是891896832。
将程序中的int型换成double型后,运行结果如下:
由于double的有效位数更多,表数范围更大,因此没有发生溢出,答案正确。
上一篇: js基础之数组API
下一篇: js基础复习之数组