欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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;
}

测试结果如下:
CSAPP学习日志2:Sq
由图可以看出:①当./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型后,运行结果如下:
CSAPP学习日志2:Sq
由于double的有效位数更多,表数范围更大,因此没有发生溢出,答案正确。