`

java 补码解释

    博客分类:
  • java
 
阅读更多

1.byte的大小为8bits而int的大小为32bits 
2.java的二进制采用的是补码形式 

在这里先温习下计算机基础理论 

byte是一个字节保存的,有8个位,即8个0、1。 
8位的第一个位是符号位, 
也就是说0000 0001代表的是数字1 
1000 0000代表的就是-1 
所以正数最大位0111 1111,也就是数字127 
负数最大为1111 1111,也就是数字-128 

上面说的是二进制原码,但是在java中采用的是补码的形式,下面介绍下什么是补码 

1、反码: 
一个数如果是正,则它的反码与原码相同; 
一个数如果是负,则符号位为1,其余各位是对原码取反; 

2、补码:利用溢出,我们可以将减法变成加法 
对于十进制数,从9得到5可用减法: 
9-4=5 因为4+6=10,我们可以将6作为4的补数 
改写为加法: 
9+6=15(去掉高位1,也就是减10)得到5. 

对于十六进制数,从c到5可用减法: 
c-7=5 因为7+9=16 将9作为7的补数 
改写为加法: 
c+9=21(去掉高位1,也就是减16)得到5. 

在计算机中,如果我们用1个字节表示一个数,一个字节有8位,超过8位就进1,在内存中情况为(100000000),进位1被丢弃。 

⑴一个数为正,则它的原码、反码、补码相同 
⑵一个数为负,刚符号位为1,其余各位是对原码取反,然后整个数加1 

- 1的原码为 10000001 
- 1的反码为 11111110 
+ 1 
- 1的补码为 11111111 

0的原码为 00000000 
0的反码为 11111111(正零和负零的反码相同) 
+1 
0的补码为 100000000(舍掉打头的1,正零和负零的补码相同) 

Integer.toHexString的参数是int,如果不进行&0xff,那么当一个byte会转换成int时,由于int是32位,而byte只有8位这时会进行补位, 
例如补码11111111的十进制数为-1转换为int时变为11111111111111111111111111111111好多1啊,呵呵!即0xffffffff但是这个数是不对的,这种补位就会造成误差。 
和0xff相与后,高24比特就会被清0了,结果就对了。 

---- 
Java中的一个byte,其范围是-128~127的,而Integer.toHexString的参数本来是int,如果不进行&0xff,那么当一个byte会转换成int时,对于负数,会做位扩展,举例来说,一个byte的-1(即0xff),会被转换成int的-1(即0xffffffff),那么转化出的结果就不是我们想要的了。 

而0xff默认是整形,所以,一个byte跟0xff相与会先将那个byte转化成整形运算,这样,结果中的高的24个比特就总会被清0,于是结果总是我们想要的。
分享到:
评论

相关推荐

    Java 补码详细内容解析

    ### Java 补码详细内容解析 #### 一、补码的概念及表示方法 在 Java 及其他现代计算机系统中,整数通常采用补码(Two's Complement)形式表示。补码表示法不仅简化了加减运算过程,还使得负数的存储与正数一样简单...

    JAVA中原码反码补码详细介绍

    详细介绍JAVA中原码,补码,反码的概念,对于初学者有较好的帮助。

    java程序 给出补码,自动生成其原码 源代码

    我自己写的,感觉 补码到原码的转化,在程序中会用到。我写的是一个串口通讯的项目。我网上找了很久,发现都没有人写过这个代码,我调试了半天,写成功了,大家有需要,就下载,也给我加加积分

    java 整数转二进制补码源代码

    整数转二进制补码的源代码 提供了两种方法:一种调用java api中的方法。另一种是自己实现的。

    Java为什么使用补码进行计算的原因分析

    Java选择使用补码进行计算的原因主要源于补码在表示和操作负数时的高效和便捷。在二进制系统中,正数的原码、反码和补码是相同的,而负数则需要通过特定的方式来表示。补码的引入解决了负数在计算机中的表示问题,...

    计算机补码

    * 编程语言:补码可以用于编程语言中,例如 C 语言、Java 语言等 补码的优点 补码有以下几个优点: * 解决了负数的机器表示问题 * 提高了算术运算的速度和效率 * 简化了编程语言的设计和实现 补码的缺点 补码也...

    java原码补码反码关系解析

    本文将详细介绍Java原码、补码、反码的关系,并提供实例代码进行解释。 一、原码 原码是指将数字转换成二进制形式的代码。无论源数据是十进制还是十六进制,统统将数字转成二进制形式。例如,十进制整数-5的原码是...

    计算机中的原码、反码和补码

    在C语言中,-1的补码形式为11111111(在一个字节的上下文中),当以无符号类型输出时,这将被解释为255,因为11111111在无符号整数中表示的就是255。 总之,原码、反码和补码是计算机科学中不可或缺的概念,它们...

    【Java】循环移码和补码.zip

    在本项目"【Java】循环移码和补码.zip"中,主要探讨的是Java编程语言中的位操作,特别是关于循环移码(Circular Shift)和补码(Two's Complement)的概念及其应用。位操作是计算机科学的基础,对于理解底层数据处理...

    java实现源码转补码-jssnowball:JavaScript雪球投票者

    java实现源码转补码JavaScript Snowball Stemmers 所有 JavaScript 词干分析器都是从使用 transpiler 的词干算法的 Java 实现中转译而来的。 该项目不仅提供预构建的 JavaScript 词干分析器,还允许创建新的词干分析...

    java二进制补码源码-instantiate-two-instances-of-same-class:Java初学者基础练习

    java二进制补码源码 Java程序的基本结构练习:创建同一个类的多个对象 请在中创建指定类的多个对象并修改其成员。在提交Pull Request之前,你应当在本地确保所有代码已经编译通过,并且通过了测试(mvn clean verify)...

    JAVA基础补充(0)-原码反码补码.doc

    本篇将详细解释整数在计算机中的表示方式,尤其是原码、反码和补码的概念。 首先,计算机内部无法直接表示正负符号,因此采用了二进制编码来区分正负。最高位被指定为符号位,其中0代表正数,1代表负数。这种表示...

    为什么需要反码和补码?.docx

    在计算机科学中,二进制编码是数据存储和计算的基础。特别是在处理整数时,我们需要了解几种不同的编码...在Java和其他编程语言中,这些底层的计算原理虽然通常被抽象掉,但理解它们有助于深入理解计算机如何处理数值。

    java实现源码转补码-Java-Cheatsheet:Java笔记备忘单,侧重于基础知识和有用的面试技巧

    java实现源码转补码目录 变量范围 当地的 实例 类/静态 在方法、构造函数或块中声明 在类中声明,但在方法/块之外 与实例相同,但使用static关键字 进入区块时创建,退出区块时销毁 在创建对象时创建 ( new )。 当为...

    CoreJava全套详细笔记资料.pdf

    CoreJava全套详细笔记资料.pdf CoreJava是Java编程语言的核心部分,涵盖了Java语言的基础知识和高级应用。以下是对给定文件的详细解读和知识点总结: 一、原码、反码、补码 * 原码是指一个数的二进制表示形式,...

    java二进制补码源码-Algorithms-in-Java:常用算法包括:排序算法,两个指针,动态编程,回溯,KMP,位操作等

    Java二进制补码是计算机科学中的一个基本概念,它涉及到如何在计算机内部表示和操作整数。在Java中,所有整数类型(如int、byte、short、long)都是以二进制补码的形式存储的。补码系统使得负数的运算与正数一样简单...

    【IT十八掌徐培成】Java基础第02天-02.字节-负数表示-补码-128计算.zip

    在这个Java基础教程中,"徐培成"老师将引导我们深入理解字节、负数表示以及补码的概念,特别是针对128的计算。这些知识点是理解和处理计算机内部数据表示的基础。 首先,我们来谈谈“字节”。在计算机科学中,字节...

    java二进制补码源码-create-two-classes-in-different-package:Java初学者基础练习

    java二进制补码源码 Java程序的基本结构练习:在不同的包中创建两个类 请在如下的包中创建指定的类: 在com.github.hcsp.pet1包中创建一个名为Cat的公开类public class。 在com.github.hcsp.pet2包中创建一个名为Dog...

    2021年JAVA学习笔记.doc

    * 平台无关:Java生成字节码,由Java解释器来解释 * 多线程:Java在语言级上支持多线程 * 动态:Java将变量或方法引用转换成符号引用保存下来,传递给解释器,由解释器来动态决定其加载 三、Java跨平台原理 * Java...

    java实现源码转补码-awesome-linq:精选的精选LINQ库、工具等

    java实现源码转补码很棒的 LINQ 介绍 精选的精选 LINQ 库、工具等。 目标是建立一个由社区驱动的非常知名资源的分类集合。 灵感来自 GitHub 上的整个awesome-*趋势。 随时欢迎分享、建议和贡献! 请先看一看。 感谢...

Global site tag (gtag.js) - Google Analytics