c语言补码计算方法,探讨C语言学习中补码计算方法.doc

探讨C语言学习中补码计算方法

探讨C语言学习中补码计算方法

摘要:补码是C语言学习中的一个重点和难点,如何能够快速准确地计算出各个数的补码值得我们探讨。本文从补码的意义入手,采用逆向逻辑思维,分别提出了“定义法”、“查零法”、“零减法”和“找1法”4种补码计算的方法,从而使补码的学习变得简单易懂。

关键词:补码计算逆向逻辑思维定义法查零法零减法找1法

学习C语言的时候,很多人都有一个共同的感受就是补码的计算非常麻烦,而且容易出错。有哪些方法可以快速并且准确地计算出某个数的补码呢?针对这个问题,我们从原码、反码和补码的概念入手,论述了补码提出的意义,并由此总结了补码计算的4种方法,希望能对大家有所帮助。

一、什么是原码、反码和补码

我们知道,在计算机内部存储的带符号数都是以补码形式存储,用补码形式进行运算的。什么是一个数的补码?为什么要用补码?这要从数的原码、反码开始讲。我们以整型数为例,且假定字长为8位。

1、 原码

整数X的原码是指:其符号位为0表示正,为1表示负;其数值部分就是X的绝对值的二进制数。X的原码通常用【X】原表示。如:

【+100】原【+0】原

【-100】原【-0】原注意:在原码中,零有两种表示形式。

原码表示法简单易懂,与真值(带符号数本身)转换方便,只要符号还原即可,但当两个正数相减或不同符号数相加时,必须比较两个数哪个绝对值大,才能决定谁减谁,才能确定结果是正还是负,所以原码不便于加减运算。

2、 反码

X的反码是指:对于正数,反码与原码相同;对于负数,符号位不变,其数值位X的绝对值取反(1变0,0变1)。X的反码通常用【X】反来表示。如

【+100】反【+0】反

【-100】反-0】反

注意:在反码中,零也有两种表示形式。

反码运算也不方便,通常用来作为求补码的中间过渡。

3、 补码

X的补码是指:对于正数,补码与原码相同;对于负数,符号位不变,其数值位X的绝对值取反后在最低位加1。X的补码通常用【X】补来表示,实际上,【X】补=【X】反+1。如:

【+100】补【+0】补

【-100】补【-0】补

注意:在补码中,零有唯一的编码,【+0】补=【-0】补

补码运算简单方便,符号位可以作为数据的一位参与运算,不必单独处理;二进制的减法可用其补码的加法来实现,简化了硬件电路。

二、补码的意义

首先,我们来看几个例子。

【例子1】用8位二进制数分别表示+0和-0 。

解:我们知道,对于有符号数,我们规定最高位为符号位,0表示正数,1表示负数。剩余位为数值位,用来表示数的大小。

所以+0就表示为0000 0000,而-0表示为1000 0000。

【例子2】计算9-6的结果。

解:我们知道:9-6=9+(-6)=3

0000 1001

+1000 0110

1000 1111

结果为-15,明显不对。

而如果我们采用补码来进行计算呢?

我们知道,9的补码是0000 1001,-6的补码重新进行运算,

0000 1001

+1111 1010

1 0000 0011

最高位的1溢出,剩余8位二进制表示的是3的补码。结果为3,正确。

【例子3】分析程序运行结果。

main()

{int a=100,b=-1;

Printf(“a=%d,%x,%o,%u\n”,a,a,a,a);

Printf(“b=%d,%x,%o,%u\n”,b,b,b,b);}

运行结果:

a=100,64,144,100

b=-1,ffff,177777,65535

【例子1】中,为什么同样一个0有两种不同的表示方法呢?

【例子2】中,为什么第一种计算方法会错,而用补码计算结果才对呢?

而【例子3】中,为什么-1以十六进制、八进制以及无符号整型输出的结果分别变成了ffff,177777,65535?

这是因为在计算机系统中,数值一律用补码来表示(存储)。

主要原因:

1、统一了零的编码;

2、将符号位和其它数值位统一处理;

3、将减法运算转变为加法运算;

4、两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

三、补码的计算

1、定义法

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
原码反码补码计算口诀是: 1. 原码:符号位加上真值的绝对值。 2. 反码:将原码的符号位保持不变,其余位取反。 3. 补码:反码加1。 例如,对于一个8位二进制数,如果要计算其反码,可以按照以下步骤进行: 1. 将符号位保持不变。 2. 将其余位取反。 对于补码计算,可以按照以下步骤进行: 1. 先计算其反码。 2. 在反码的基础上加1。 这样,就可以得到原码、反码和补码计算结果。 #### 引用[.reference_title] - *1* [原码, 反码, 补码的基础概念和计算方法](https://blog.csdn.net/Chinajsczlymyc/article/details/126910306)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [(转)java 原码反码补码计算 以及 取反运算,原码反码补码运算公式](https://blog.csdn.net/PacosonSWJTU/article/details/128604733)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [原码,补码,反码概念和计算方法详解](https://blog.csdn.net/qq_39541098/article/details/122729622)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值