实验代码之sq.c

本章是计算机系统基础的第一个实验,主要是用来测试int型数据的范围大小。
C语言中的int型数据是32位整型存储类型,只有四个字节可用,这就直接限定了其数据大小的绝对范围。由理论二进制32位大小可知,int型最大范围应不超过2的32次方,但这是建立在原码的基础之上的。而在计算机中,由于需要表示负数,故原码并不适用,所以取补码形式用于表现一个整数的正负数部分,因此大略来说它的范围应该再次折半!
这个实验可以帮我们验证以上所述,具体代码如下:

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

以下为输入参数及结果:

1.zhaoxiaoan@zhaoxiaoan:/mnt/hgfs/CS2$ ./sq 12
sq(12) = 144
2.zhaoxiaoan@zhaoxiaoan:/mnt/hgfs/CS2$ ./sq 65535
sq(65535) = -131071
3.zhaoxiaoan@zhaoxiaoan:/mnt/hgfs/CS2$ ./sq 40000
sq(40000) = 1600000000
4.zhaoxiaoan@zhaoxiaoan:/mnt/hgfs/CS2$ ./sq 50000
sq(50000) = -1794967296
5.zhaoxiaoan@zhaoxiaoan:/mnt/hgfs/CS2$ ./sq 400000
sq(400000) = 1086210048
6.zhaoxiaoan@zhaoxiaoan:/mnt/hgfs/CS2$ ./sq 500000
sq(500000) = 891896832

上述代码所表现内容为返回输入整数值得平方。我们看参数结果部分,第1行无输入也就无返回值。第2行输入12返回144是正确答案,于是我们将输入值往大放,输入65535,这个时候我们可以看到返回值变成了负数,肯定是错误的。那么这个负数是怎么来的呢?我们知道,因为数据只有32位,且第一位是符号位,当我们输入的正数值大到一定范围之后,导致第一位的0变成了1,在这里我们要强调,计算机是不能按照我们人类的思维来的,你只能将可能出现的错误告诉它,当出现这类情形的时候它会自动跳到你告诉它的处理方式去,不能理所当然认为计算机能够自己进行判断!这时候符号位改变,也就是“溢出”了,所以它的返回值从正数变成了负数。这里我们要强调,并不一定只有正数变负数、负数变正数才算溢出,例如我们看到第6、7,它的输入值和返回值都是正数,但是我们一眼就能看出来答案是错误的,所以大家一定要细心、认真,这是因为它溢出得太多了,导致32位上恰好为0而前面可能截断了好几个1!根据4、5行我们可以判断,int型数据的范围大概就在40000到50000的平方之间,也就验证了我们前面所说的它是有范围限定的!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值