大家好,今天小编来为大家解答以下的问题,关于我的低年级同学不明白原码、反码、补码。我很生气,连夜把这件事告诉了女朋友。,这个很多人还不知道,现在让我们一起来看看吧!
前言
这个故事是一个真实的故事。前两天我被一个小学生折磨死了。我不在乎我看不懂原码、反码、补码。讲了一遍还是不明白。
我不明白。是二进制太难还是我太难?你不相信吗?设置图片为证:
他直接问我,我很困惑。二进制符号位不参与运算?我听了之后很困惑,哈哈哈。然后我告诉他我想参与计算,然后又一个问题:
他眼神中如此笃定的神情让我有些困惑。我吓坏了,就敲了一段代码,验证一下结果没有问题,然后又给他解释了一遍。
本以为应该可以,但是凌晨1.30.
算了算了,这孩子救不了了,不管了。本想给女票滴滴晚安,但也想起了我对原码、反码、补码的困惑。
我记得我刚学C++的时候:这个东西的代码是不需要的。刚开始学习操作系统和组成原理的时候:emumm,跳过吧。所以,我以前一直无法理解二进制,对二进制很抵触:既然方法号都封装了,何苦还要搞二进制呢。但事实上,二进制的知识是无论如何也绕不开的知识点。想着拯救更多饱受二进制或原码逆补之苦的小学生,我必须站出来做点什么。
就先拿你女朋友当小白鼠来测试一下吧。网友直呼他是专家!
以下是豚鼠的全部内容。为了保证实验结果的严谨性,我不会给大家带来对话场景。
二进制数字
什么是二进制?百度百科对二进制的定义如下:
二进制是指数学和数字电路中以2 为基数的表示法系统。 Base-2 意味着系统是二进制的。在这个系统中,通常用两个不同的符号0(代表零)和1(代表一)来表示[1]。在数字电子电路中,逻辑门的实现直接使用二进制,所以现代计算机和计算机相关设备都使用二进制。每个数字称为一位(Bit,二进制数字的缩写)
其实二进制中的01对应的是数字电路中的通断开关,所以整个计算机中的一切都是二进制科学,只不过我们只需要研究二进制数之间的关系即可。这也是最简单的,因为二进制本身就可以表示数字。
如果我们不谈原码、补码、补码,只看二进制和十进制的关系,不考虑位数,我想大多数人都能理解。
比如2:10的二进制、3:11的二进制、4:100的二进制、5:101的二进制。负数的二进制怎么办? -2 二进制-10? -3 二进制-11?这不太合适,为什么后面要加这么一个负数呢? (问题1)另外,如果这个长度不确定的二进制是一个数组,我怎样才能在计算机内存中找到它(问题2)?我们用一张可能不合适的图片来展示一下:
乍一看大家都说这不可能,所以在计算机数值类型设计之初就明确表示,计算机基础数据是固定长度的,由两部分组成:个符号位(一位)和数字位(几个位)。符号位(几个位) 0或1的位分别代表正数和负数,数字位代表数据的大小。
你可能会直接问:一个数字代表多少位数字?如果位数据太长,数据又很小(全部以0开头),就会造成内存的浪费和浪费。位数太少的话就装不下了,网友表示确实很难。
伟大的设计师肯定已经考虑过这个问题。他们把数值二进制的长度分成了不同的长度供你使用。 Java中有以下8种基本数据类型(1byte=8bit):
基本类型长度(字节)包装类型取值范围byte1Byte-128~127short2Short-32768 ~ 32767int4Integer-2147483648~2147483647long8Long-9223372036854774808~9223372036854774807float4Float3 .4028 23e+381.401298e-45(e+38表示乘以10的38次方,并且e-45表示乘以10的负45次方) double8Double1.797693e+3084.9000000e-324char2Characterboolean 官方未确定Booleantrue false
例如,如果你的字节a=1,它在内存中看起来像这样:
0000 0001
如果你int b=1;因为int是32位的,那么它在内存中的存储方式是这样的:
00000000 00000000 00000000 00000001
你可能会问为什么没有提到负数?不要着急,慢慢来。下面讨论原码、反码和补码。另外,需要注意的是,如果二进制加法溢出,则溢出部分不会被记录,只会保存有效部分,所以在选择数据类型时还必须考虑目标数据的大小范围。
原码
既然我们已经初步了解了二进制数的一些规则,那就让它来得更猛烈一些吧。原来的代码是什么意思?
原码是二进制的初始表示符号位,即最高位为符号位:该位为0表示正数,1表示负数(0有两种表示:+0和-0),剩余位表示值的大小。
显示值是否简单?原始代码的优点是它更清楚地表示一个值。你可以清楚地知道这个二进制数代表什么,简单直观。
但我们能畅通无阻地使用原来的代码吗?
当然不是。虽然原始代码可以很容易地表示正数和负数,但我们观察它的加法:
正数相加没有问题,但是负数相加有一个问题:负数相加只考虑了绝对值的增加,没有考虑到负数的特性。负数加负数的绝对值是相反的,所以在原代码中加负数就成了一个难题,无法解决。
反码
负数的原始代码无法实现加法,因为如果原始代码相加,则无论符号如何,它都实现了值的绝对值的加法。所以这与负数的加法规则相矛盾,计算机只能加。我们只能做其他的计算。
这时,一些伟人发现了反码,反码的定义是这样的:正数的反码与其原码相同;负数的反码是将正数逐位取反,符号位保持为1。因为负数原码的加法是相反的(即加一的操作变成减一) ),我们认为如果把负数原码中的数字01颠倒过来,那么这个数字会有更多有趣的东西。
原代码中原本比较大的数字(-1、-2等)经过这次转换后看起来就很小了。本来很小的数字经过这样的转换之后看起来就很大了。 (也无法直观地看出这个数字是什么)转换后的数字相加(正数),交换01后即可进行正常的加法逻辑。添加负数似乎没问题。但这真的足够了吗?正数和负数可以用反码表示而没有任何阻碍吗?不不不。我们记得原代码中有+0和-0。但不影响操作。看一下补码中的+0和-0:
你看,就算你把代码反过来也行不通。我应该怎么办?请参阅下面的补体分析。
补码
为什么反向编码会出现这个问题?主要原因是正负0会造成两个陷阱:
也就是说,如果用补码来表示这个数,用它来进行加法运算,那么在正数范围内玩就没问题,在负数范围内玩也没有问题数字,但是当你从负数步进到正数时,你会经过两个0(-0,+0),这两个0重复地由两个零表示。
这应该如何表达呢?我们来看看这些数字的逆向编码规则:
-3 的补码: 1111 1100 -2 的补码: 1111 1101 -1 的补码: 1111 1110 -0 的补码: 1111 1111+0 的补码: 0000 0000
如果我们能把这些负数的补码加上1,那么正负0的矛盾很快就不存在了?这就是所谓的补码:符号位不变,正数的补码与原码和补码相同,负数的补码是其补码加1。
就这样,我们解决了所有的问题,并进行了强大的计算。事实上,在计算机中,我们也使用二进制补码来表示二进制的所有数值。
对于两者的补码,你确实无法直接说出它是什么。负数可能理解起来有点抽象。我们应该如何理解两者的补码呢?我是这样理解的:二进制数将数据分为正数和负数部分,分别代表两个区间:
这是什么意思?这意味着您可以将负数视为一部分,将正数视为一部分。各部分的值也相同:无论负数还是正数,符号位分布在000 0000到111 1111(以字节为例)。如果前一个符号位为1,则表示负数。从最小到最大(-128 ~ -1)共有128 个负数。如果为0,则表示从最小到最大(0~127)共有128个正数。这样是不是更容易理解了呢?
测试
该代码将合并如下。
总结
至此,你对原码、反码、补码是不是有了更透彻的认识了呢?不管你听不懂,你问她听不懂,她是这样说的:
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/99544.html
用户评论
┲﹊怅惘。
哈哈,这事情太 relatable 了!我女朋友也是cs专业的,我也经常跟她一起研究编程问题,有时候她的专业知识把我这个小白弄晕死了😂 但幸好她耐心很好,虽然我理解学弟的感受,不过也建议他多动手练习一下,实战经验比单纯理论讲解有用得多。
有11位网友表示赞同!
眼角有泪°
这种“你跟我学”的感觉确实很气人!明明自己都花了心思去理解了,结果别人一点都不领情。下次遇到类似的情况,可以尝试把解释换种方式,比如用更轻松的语言或案例来解释,或者引导他思考问题,而不是直接给出答案。
有6位网友表示赞同!
伱德柔情是我的痛。
这篇文章写的有点夸张啊🤣 我也是程序员,不过跟女朋友说编程概念的话,她基本都懂我的意思。可能你们之间的沟通方法还是存在一些差异吧!毕竟情感和理性总是难以平衡 😂
有18位网友表示赞同!
熏染
我也是计算机专业的,我理解你学弟的痛苦… 因为确实有些同学就是缺乏耐心和学习兴趣,所以解释起来难度比较大。建议这位姑娘可以试试引导式提问,让学弟自己去分析和思考问题,这样更有助于他理解原码、反码、补码的概念。
有9位网友表示赞同!
空谷幽兰
我觉得你女朋友很厉害啊!能把复杂的编程概念讲清楚,而且还能保持耐心的一整夜?简直是爱神附体!❤️ 我想这位学弟应该太幸运了,遇到这么好的女朋友帮忙学习啦!
有10位网友表示赞同!
呆萌
这事情听着有些搞笑,不过也让我有点感同身受。有时候确实会遇到一些不懂问题的同学,解释再清楚也不懂,反而让自己感到很沮丧的经历… 大家在互相学习的过程中,还是需要多沟通,理解彼此的想法和感受。
有10位网友表示赞同!
我一个人
这位学弟可真是倒霉!女朋友都通宵帮他解释了,结果可能还是一无所获啊。如果我是他,我会更加努力地学习,不要让女朋友白费时间啊! 认真想想学习原码、反码、补码的重要性吧!
有6位网友表示赞同!
゛指尖的阳光丶
原码、反码和补码确实是编程的基础知识,学弟不懂这种问题确实比较影响后面的学习节奏。不过我觉得这位女朋友很不错,能耐心地帮他解惑,相信学弟也能在她的帮助下快速理解这些概念!🙌🏻
有6位网友表示赞同!
身影
这篇文章写的有点太激进了啊,像是我男朋友那种爱吐槽的性格 😂 我觉得沟通应该是双向的,如果学弟确实没有认真学习的态度,女朋友也应该及时提醒他要注意学习方法,避免浪费时间和精力。
有15位网友表示赞同!
米兰
原码、反码、补码都是计算机的基础知识,理解这些概念对于以后学习代码开发非常重要。建议学习者多加练习,并尝试用实际应用来巩固知识点 。
有20位网友表示赞同!
孤城暮雨
我感觉这位女生真是个好姑娘!她愿意花时间教导学弟,并且还能保持耐心,这种爱心和责任感值得点赞👍 希望学弟也能珍惜这样的机会,认真学习,争取早日把原码、反码、补码都学会!
有11位网友表示赞同!
巷雨优美回忆
这篇文章让我回忆起自己当年学习编程的经历。也遇到过很多不懂的问题,幸好有我的老师和同学们帮我解惑! 学习编程确实需要一点时间和耐心,希望这位学弟能够找到适合自己的学习方法,早日掌握这些基础知识。
有15位网友表示赞同!
■□丶一切都无所谓
我总觉得编程不是只有理论,更重要的是实践经验。如果想真正理解原码、反码、补码的概念,建议多写点代码,从实际操作中感受它们的原理和作用。
有20位网友表示赞同!
千城暮雪
感觉这位学弟就像很多同学一样,学习的时候总是遇到各种各样的麻烦? 其实很多难题都能通过勤奋练习和认真思考来解决。希望这位学弟能够提高学习积极性,认真对待每一项知识!
有19位网友表示赞同!
残花为谁悲丶
这种“我跟你学”的感觉确实很让人心累!建议下次遇到这种情况,可以尝试换个方式跟学弟沟通,或者找一些实际案例来帮助他理解原码、反码、补码的概念。
有8位网友表示赞同!
〆mè村姑
其实编程的学习是一个不断探索的过程。 除了理论知识,还需要多实践、多思考、多交流才能真正掌握它。希望那位学弟能够抱持积极的心态继续学习,相信他会取得进步!
有15位网友表示赞同!
七级床震
学好编程需要认真学习,理解原码、反码、补码也是基础工作。建议这位学弟能够静下心来,认真学习,不要轻易放弃!
有10位网友表示赞同!
|赤;焰﹏゛
这篇文章让我想起我刚开始接触编程的时候,也遇到过很多困惑和难题。还好那时候有朋友帮我解答,才得以顺利学习下去。希望那位学弟也能遇到一个能帮他解决问题的“女朋友”哦!
有19位网友表示赞同!