c语言教程 钱能,《C++程序设计教程》(钱能 主编)P32 题目1

《C++程序设计教程》P32 题目1

题目:设整数42486,请定义一个变量,初始化之,并以8进制与16进制数输出。如果将该整数定义成无符号短整数,当以有符号整数输出时,结果是什么,请用补码概念解释。

————————————————————————————————————————————————-

解答:

#include

#include

#include

void main()

{

long a=42486;

cout<

cout<

unsigned short b=42486;

cout<

cout<

printf("%u \n",b);

}

编译通过,运行结果为:

a4c26d1e5885305701be709a3d33442f.png

——————————————————————————————————————————————

疑惑:

1、运行结果没有变化。

2、如何以有符号数输出?

3、什么是补码?

——————————————————————————————————————————————

3、关于补码:

补码表示法首先计算机中采用的补码表示法;对于n位有符号数,补码数值表示范围为:

[-2(n-1),2(n-1)-1],而且[-128]补 =

10000000,这是人为规定的。补码的计算方法

正数补码即原码

负数补码为绝对值反码+1,并置符号位为1

[-1]补 = 11111111 ?

-1 取绝对值 1

1 的原码是 00000001

1 的反码是 11111110

反码+1是 11111111

符号位置1 11111111

<== -1的补码

原码,反码原码八位二进制为11111111 ~

01111111,最高位是符号位,所以是-127 ~ 127.

同理,反码即是原码取反,自然也是-127 ~ 127.

0的原码,反码,补码

+0原码是 00000000

-0原码是 10000000

+0反码是 00000000

-0反码是 111111110补码是 00000000

<== 补码没有正0与负0之分

-1 == ~0 ?上面说过-1的补码是11111111,而0的补码是00000000,~0就是11111111

所以-1和~0的计算机表示都是11111111

所以-1 == ~0返回真

昨晚苦思冥想了一夜,终于把补码搞懂了。

要想学习计算机,那么第一步就是必须弄懂,计算机中是如何存储数据的。首先计算机中只能存0

1这样的二值数据是众所周知的。

那么下面我想谈一谈计算机中是如何存储整数数据的。在此之前我所见过的所有教材都是说计算机是以补码形式存储的。那么这句话

对不对?答:错,错的体无完肤。

1,模的概念:

什么叫做模,我给模下个定义就是:在一定存储空间中,所能表示的所有数值的个数。

2,补码的概念:

什么是补码?我先以时钟来说明一下。以十二进制论,那么时钟上的时针能表示0、1、2、3、4、5、6、7、8、9、10、11,这些时刻。

所以它的模是12.假如时针现在指向7点,要想把它调为指向3点,该怎么办呢?有两种方法,第一种就是逆时针拨4格,即7-4=3.第二种方法是顺时针拨8格,即7+8=15,由于时钟只能表示十二个数,所以时针实际指向的是15=3.%为求余运算符,就是求15除以12的余数。那么我们现在可以得出一个结论:7-4=(7+8)。这里我们称4和8互为补码。如果说4是原码,那么8就为4的补码,如果说8为原码,那么4就为8的补码。两个补码之和就等于模(4+8=12)。在这里我们发现4和8都是大于等于零的。所以我们要强调的是只有正数才有补码。负数没有补码。并且得出计算补码的方法就是用“模减去源码得到补码”。那么下面我们来看计算机中的二进制表示:

假如字长为四位,那么它的模就是2的4次方,即16.那么无符号数3在计算机中如何表示呢:答案是:0011,我们看到计算机就是用原码来存储无符号数字3的。所以开头说计算机使用补码来存储整数是错误的。无符号数4在计算机中的表示为0100,我们来看计算机做加法运算3+4是怎么做的:0011+0100=0111结果为7,完全正确,那么再看减法:3-4:0011-0100=1011结果为11,结果就错了,因为无符号数不能表示负数。下面我们在看有符号数。仍然假设字长为4位。我们用最高位表示符号位:+3位0011;+2为0010;加法:3+2:0011+0010=0101=+5,结果正确;再看减法:2-3:0010-0011=1111,结果为-7,答案是错的。我们知道答案应该为-1,即1001.那么为什么会出去呢?应为计算机将符号位一起参加运算了。为了解决这个问题,我们不让计算机中出现负数,如果只有整数就不会产生错误了。那么怎么办,我们知道2-3=(2+13),即将这个3用它的补码来表示。那么15的表示是1111,也就是1的补码。转换成我们能识别的就是-1(最高位表示符号位)这下就正确了。这就是计算机中为什么要用补码表示的原因了。在C语言中我们知道“-”是一个负号运算符,我们就这样理解,它的作用就是将它后面跟的数字求补码,然后存放到计算机中。所已在计算机中只做加法运算。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值