一、toBinaryString 方法及其含义

1.1 方法说明

该方法位于java.lang.Integer类中

方法签名:public static String toBinaryString(int i)

含义:返回参数数值的补码形式,正数则忽略前面的0。(官方注释:返回表示传入参数的一个无符号(这里无符号大概只是指前面没有+-号,但还是有符号位) 的二进制字符串。如果参数为负数x,返回值为 2^32 + x 【就是它的补码】)

1.2 使用示例

    System.out.println(Integer.toBinaryString(3)); // 输出:11
System.out.println(Integer.toBinaryString(-248)); // 输出:11111111111111111111111100001000

二、计算机数值存储原理

2.1 相关概念

计算机中,包括如Java在内的各语言均是用补码来存储数值的

  • 原码:最高位表示符号位 "1"为负、"0"为正,其他位为正常二进制形式。
  • 反码:正数的反码即原码本身;负数则在原码的基础上,除符号位之外的其他各位置反。
  • 补码:正数的补码即原码本身;负数则在反码基础上+1。

例:

正数:3 = 0000 0011[原 | 反 | 补]

负数:-3 = 1000 0011[原] = 1111 1100[反] = 1111 1101[补]

注:

  1. 以上规则只是方便我们人来进行推算,而在实际情况中存在不适用的情况,如:1000 0000[补] = -128。关于这点,后面会解释到。

2.2 为什么会引入补码

通过引入补码,CPU只需单纯的加法器即可完成加减运算,节约成本。

2.3 背景知识:模系统中的运算及理解

1) 一个数加上模,等于它自身

在任意模系统中,其模为:数所能表示的最大值+1。具体到对于n位二进制,其模则为2^n。

注:但对于一般的加减运算来说,是不需要回到自身的(显然的事实,但之前莫名其妙老想着回自身),直接加一个数就行了,只是当加数>=模时,会超过模(溢出高位舍去)然后到达一个值。

示例及理解证明

  1. 钟表上(把12换作0),所能表示的最大数为11,因此其模就为11+1=12。

    根据常识,显然从4点转动12小时,又会回到4点本身,即 4 + 12 = 4
  2. 对于2 bit系统,其模为 11b + 1 = 2^2 = 4。

    例:01b + (1)00b = 01b【此处(1)00b表示4,因为高位溢出舍去,显然还是等于它自身】

2) 什么是同余数?

对于同一个除数的余数相等,则这些数称为同余数。具体的对于数a、b、c,若有a%c == b%c,则称a、b彼此是关于c的同余数。

3) 在模系统中,同余数有什么特性?

在模系统中,加上数a可等价为加上它的同余数b。

示例及原因

  在模 n = 12 的系统中,假设有数 a = -4,构造它的同余数 "k*n + a", k=0,1,2...【公式含义:任意倍数的模n加上a,因此显然是a关于n的同余数(因为倍数k都作为除法的结果上去了,余数始终为 a )】比如 b = 1*12 + (-4) = 8

根据同余数的构造原理显然可知,在模系统中,加上数a等价于加上同余数b。

【证明步骤:】

c + b = c + k*n + a

因为上述背景知识1),所以 c + k*n = c

所以 c + b = c + a

2.4 将减法转换为加法

  • 思路1:基于同余数的特性,在模n的系统中,对于减法 a - b,可进行以下转化:a - b => a + (-b),令 c = n + (-b)【由同余数构造可知,显然c是(-b)的最小正同余数】,因此 a + (-b) => a + c,而 (-b)的补码正好就等于c,也就是最小正同余数,所以 a - b => a + (-b)补。
  • 思路2:基于模原理,减法则能换成加法来做:令 c = (n-a) + (a-b) = n-b【 n-a 为了使a+c超过模重置为0,(a-b) 移到具体位置】,而 n-b 显然是(-b)的同余数【根据同余数构造可知】,因此 a + (-b) = a + c,而 (-b) 的补码正好等于c。因此 a + b = a + (-b)补。

因此,CPU只需加法器也能完成减法运算。

注:至于为什么(-b)的补码正好就是最小正同余数c,暂未深挖。就是刚好是。

2.5 补码系统中,符号位也要参与运算

使用补码的系统中首位(即符号位)也要参与正常运算,只是当溢出时实际符号可能会倒置,未溢出时运算均是正确的。

(正确性证明,可参考其他博文https://blog.csdn.net/woodpeck/article/details/77747265

比如在8bit系统中:127 + 1 = [0111 1111]补 + [0000 0001]补 = [1000 0000]补 = -128

2.6 为什么定义 1000 0000[补] = -128

网上很多只是说为了不浪费而简单定义,但光简单定义肯定不行的,肯定还需要符合运算规律。

其实计算机对补码的存储和解释,不一定非要经过源码这一环,那是对人的一种换算方式,1000 0000[补] = -128 是符合计算机运算规律的。

比如:-128 + 1 = -127

[1000 0000]补 + [0000 0001]补 = [1000 0001]补 = [1111 1111]原 = -127

不只是1000 0000[补]=-128,在 n bit补码系统中,对于首位为1其他位为0的数,其值为 -2^(n-1)

部分参考:

https://blog.csdn.net/woodpeck/article/details/77747181

从java toBinaryString() 看计算机数值存储方式(原码、反码、补码)的更多相关文章

  1. Java中正负数的存储方式-正码 反码和补码

    Java中正负数的存储方式-正码 反码和补码 正码 我们以int 为例,一个int占用4个byte,32bits 0 存在内存上为 00000000 00000000 00000000 0000000 ...

  2. Java 原码 反码 补码

    本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希 ...

  3. java原码反码补码以及位运算

    原码, 反码, 补码的基础概念和计算方法. 对于一个数, 计算机要使用一定的编码方式进行存储. 原码, 反码, 补码是机器存储一个具体数字的编码方式. 1. 原码 原码就是符号位加上真值的绝对值, 即 ...

  4. JAVA:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题(5)

    一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...

  5. Java学习第五篇:二进制(原码 反码 补码),位运算,移位运算,约瑟夫问题

    一.二进制,位运算,移位运算 1.二进制 对于原码, 反码, 补码而言, 需要注意以下几点: (1).Java中没有无符号数, 换言之, Java中的数都是有符号的; (2).二进制的最高位是符号位, ...

  6. java基础知识-原码,反码,补码

    1.正数:原码,反码,补码:都一样. 2.负数:和正数的储存方式不同,负数都是以补码形式存储的. <1>负数的补码 把负数的原码除了符号位取反后再+1. <2>负数的原码 把对 ...

  7. Java基础-原码反码补码

    Java基础-原码反码补码 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 注意,我们这里举列的原码和反码只是为了求负数的补码,在计算机中没有原码,反码的存在,只有补码. 一.原码 ...

  8. C 标识符, 数据存储形式(原码,反码,补码)

    一.  标识符 第一个字母必须是英文字母或下划线 二. 数据存储形式(补码存储) 最高位是符号位 ---- 0表示整数 ; 1 表示负数 1. 正数:原码 = 反码 = 补码 例子 : (10) 原码 ...

  9. JAVA的枚举基本操作,对原码反码补码的理解及为运算的深入理解,浮点数计算的误差分析

    ①深入浅出的了解枚举类型 先看一段代码: enum Size{SMALL,MEDIUM,LARGE}; public class EnumTest { public static void main( ...

随机推荐

  1. 自定义的强大的UITableViewCell

    UITableView的强大更多程度上来自于可以任意自定义UITableViewCell单元格.通常,UITableView中的Cell是动态的,在使用过程中,会创建一个Cell池,根据每个cell的 ...

  2. 【JAVA】java中Future、FutureTask的使用

    如今的系统基本都是分布式的,各个系统各司其职的,不可能一个系统干了全部系统的事. 所以系统之间的交互就越来越多了.那么系统之间的交互仅仅有通过网络来交互了,而网络必定会存在延时的情况. 比方A系统的一 ...

  3. css3最新版中文参考手册在线浏览

    对于CSS 3.0,它对于我们Web设计人员来说不只是新奇的技术,更重要的是这些全新概念的Web应用给我们的设计开发提高了效率以及更多的无限可能性,我们将不必再依赖图片或者 Javascript 去完 ...

  4. HTML5裁剪图片并上传至服务器实现原理讲解

    HTML5裁剪图片并上传至服务器实现原理讲解   经常做项目需要本地上传图片裁剪并上传服务器,比如会议头像等功能,但以前实现这类需求都很复杂,往往需要先把图片上传到服务器,然后返回给用户,让用户确定裁 ...

  5. 关于MySQL的TPS和QPS

    TPS - Transactions Per Second(每秒传输的事物处理个数),这是指server每秒处理的事务数,支持事务的存储引擎如InnoDB等特有的一个性能指标. 计算方法: TPS = ...

  6. android.view.View

    * This class represents the basic building block for user interface components. A View * occupies a ...

  7. Vue框架之组件系统

    1,Vue组件系统之全局组件 1.1Vue全局组件的在实例化调用Vue的模板中导入组件的名称 <!DOCTYPE html> <html lang="zh-cn" ...

  8. mysql 查看编码方式

    一. 查看数据库的字符集 show variables like 'character\_set\_%'; 输出: +--------------------------+--------+ | Va ...

  9. java垃圾回收机制的使用

    public class Test { public static void main(String[] args) throws Exception { Book b=new Book(true); ...

  10. POJ2289 Jamie's Contact Groups —— 二分图多重匹配/最大流 + 二分

    题目链接:https://vjudge.net/problem/POJ-2289 Jamie's Contact Groups Time Limit: 7000MS   Memory Limit: 6 ...