前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >二进制补码-反码-原码「建议收藏」

二进制补码-反码-原码「建议收藏」

作者头像
全栈程序员站长
发布2022-09-06 13:18:35
发布2022-09-06 13:18:35
1.1K0
举报

大家好,又见面了,我是你们的朋友全栈君。

最近学习java基础语法的时候,对其基本数据结构中的二进制位数与十进制大小间的转换产生了疑惑,想起学习IP地址的时候也貌似产生了相同的困惑,

所以干脆总结一下,权当学习及备忘了。

在计算机内,定点数有3种表示法:原码、反码和补码 原码:就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。 反码:表示法规定:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。 补码:表示法规定:正数的补码与其原码相同;负数的补码是在其反码的末位加1。

首先需要明确是java中是用补码表示二进制数,补码的最高位是符号位,最高位为“0”表示正数,最高位为“1”表示负数。 正数补码为其本身; 负数补码为其绝对值各位取反加1;(这里还记得“若干年”前C语言老师说的一句“各位取反,末位加一”。。。)

例如: +21,其二进制表示形式是00010101,则其补码同样为00010101 -21,按照概念其绝对值为00010101,各位取反为11101010,再加1为11101011,即-21的二进制表示形式为11101011

步骤: 1、byte为一字节8位,最高位是符号位,即最大值是01111111,因正数的补码是其本身,即此正数为01111111 可以借助等比数列的求和公式,得到其十进制表示形式为(2^7-1)即127 2、最大正数是01111111,那么最小负是10000000(最大的负数是11111111,即-1)

需要强调的是,由于正数的原码、补码都一样,求其十进制大小的时候无需转换(所以也容易产生混淆),

而负数则不同。此处的最大正数01111111和最小负数10000000都是补码形式(java的语言规定。。)

3、10000000是最小负数的补码表示形式,我们把补码计算步骤倒过来就即可。10000000减1得01111111然后取反10000000 因为负数的补码是其绝对值取反,即10000000为最小负数的绝对值,而10000000的十进制表示是128,所以最小负数是-128 4、由此可以得出byte的取值范围是-128到+127

对于负数而言,需要掌握两种情况:知道其大小(十进制值),求补码;知道其补码,求其大小。

一个十进制负数转换成其二进制补码表示的时候,步骤为:

  负数—>正数(取绝对值)—->二进制补码—(末位减一,各位取反)>二进制原码

  -128 128 1000 0000 0111 1111 1000 0000

发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/155368.html原文链接:https://javaforall.cn

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档