1.sq.c的代码展示
2.运行实例
3.详细解释及知识点
1.sq.c的代码如下
#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;
}
2.运行实例
@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out
@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out 12
sq(12) = 144
@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out 65535
sq(65535) = -131071
@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out 40000
sq(40000) = 1600000000
@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out 50000
sq(50000) = -1794967296
@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out 400000
sq(400000) = 1086210048
@ubuntu:/mnt/hgfs/share/csapp_code$ ./a.out 500000
sq(500000) = 891896832
3.详细解释
为什么65535,50000,400000,500000的平方有的为负数并且明显不正确?这是因为我们忽略了整型数据的表示范围是从-2^31 到 2^32-1即-2147483648到2147483647。显然这些数的平方已经超出了范围,造成了数值溢出,变成负数是因为进位使符号位变成了1。
知识点
C语言各数据类型的取值范围