java之原反补

原码,反码,补码是java数值运算的基础,在计算机程序中,数值运算是基于二进制的,也就是说底层是二进制运算.而数值有正数与负数,二进制只有0和1,如何表示负数,如何进行正负数的运算,这就是原反补的意义所在.

基础定义:

  * 原码

    * 就是二进制定点表示法,即最高位为符号位,“0”表示正,“1”表示负,其余位表示数值的大小。

    * 通过一个字节,也就是8个二进制位表示+7和-7

    * 0(符号位) 0000111

    * 1(符号位) 0000111

  * 反码

    * 正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。

  * 补码

    * 正数的补码与其原码相同;负数的补码是在其反码的末位加1。

而在有符号数值运算过程中,运算都是基于补码来运算的,所以说,求补码是理清有符号运算的根本.

案例:

-4+3的运算原理:

3  的二进制:     0 (符号位) 0000011(源码)

      0  (符号位) 0000011(反码)

      0  (符号位) 0000011(补码)

-4的二进制:     1  (符号位) 0000100(源码)

1  (符号位) 1111011(反码)

1  (符号位) 1111100(补码)

0  (符号位) 0000011(补码)

+  1  (符号位) 1111100(补码)

-------------------------------------------

1  (符号位) 1111111(补码)

-                                    1

-------------------------------------------

1  (符号位) 1111110(反码)

取反

-------------------------------------------

1  (符号位) 0000001(原码)

转为10进制为-1,也就是计算的结果.

在java中,除了在有符号数值运算中用到原反补,在数据的强制类型转换也有用到,

例如:

byte a = (byte)300;//byte的范围是-128~127 ,而300超过,需要进行强制转换.

300的二进制形式是:00000000  00000000  00000001  00101100

强制转换(截取)后为: 00101100    //此时为补码形式

而此时最高符号位为0,即为正数,而正数的原反补是相同的,所以最后a的值为44;

第一次写,毫无章法,有些的遗漏之处,万望指出.

时间: 2024-10-25 17:01:13

java之原反补的相关文章

java 线程 原子类相关操作示例 thinking in java4 目录21.3.4

java 线程  原子类相关操作示例 package org.rui.thread.volatiles; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; /** * 原子类,

java 线程 原子类相关操作演示样例 thinking in java4 文件夹21.3.4

java 线程  原子类相关操作演示样例 package org.rui.thread.volatiles; import java.util.Timer; import java.util.TimerTask; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.atomic.AtomicInteger; /** * 原子类

java实现原数组根据下标分隔成两个子数组并且在原数组中交换两个子数组的位置

此类实现:输出一行数组数据,根据输入的下标,以下标位置为结束,将原数组分割成两组子数组.并交换两个子数组的位置,保持子数组中的元素序号不变.如:原数组为7,9,8,5,3,2 以下标3为分割点,分割为子数组一:7,9,8,5.和子数组二:3,2.经过交换算法后的结果应为:3,2,7,9,8,5 有两种交换算法<1>前插法:将子数组3,2另存在一个临时数组中,将原数组7,9,8,5,3,2每一位向后移两个位置  再将子数组3,2插入到移动好元素位置的原数组中.<2>逆置法:将原数组7

一位资深开发的个人经历 【转自百度贴吧 java吧 原标题 4年java 3年产品 现在又开始做android了】

楼主2007年从一家天津的三流大学毕业.毕业前报了一个职位培训,毕业后可以推荐工作.因为推荐的公司都是北京的,所以就来北京了. 找了一个月工作,没有找到要我的,就在出租屋里宅了起来,打着考研的旗号,又耗了一年.研究生肯定没有考上,这下没有退路了,又开始找工作了.记得宅出租屋的那年,过年没有回家.正好我有一个姑姑在石家庄过年,就非要我过去.过完年,姑姑回家和老妈说,我穿了一条破牛仔裤,头发长长的.言外之意,我在北京日子不好过. 后来老妈给我打电话,我都说,挺好的,没事儿,我姑姑就是好几年没见我了,

java多线程--原子类

java1.8中的原子操作的类在包java.util.concurrent.atomic下面,全部包括如下: AtomicBoolean AtomicInteger AtomicIntegerArray AtomicIntegerFieldUpdater AtomicLong AtomicLongArray AtomicLongFieldUpdater AtomicMarkableReference AtomicReference AtomicReferenceArray AtomicRefer

Java基础——原码, 反码, 补码 详解

上一篇提到了原码.反码和补码(见 http://www.linuxidc.com/Linux/2015-02/113862.htm),可是自己又捋了半天,有点懂了的样子,可是又不能清晰的表达.暂且记住以下两点吧: 正数的反码和补码都与原码一样: 负数的反码.补码与原码不同,负数的反码:原码中除去符号位,其他的数值位取反,0变1,1变0.负数的补码:其反码+1. 做个小Demo,分别写出7和-7的原码.反码.补码.(其中第一位是符号位,0表示正数,1表示负数) Demo 7 -7 原码 00000

java instrument原理和Aattach API

上一次分享中有一个疑问,就是目标jvm进程和代理程序,也就是卧底程序是一起运行的.还记得吗? 通过使用如下命令: java -javaagent:jar 文件的位置 [= 传入 premain 的参数 ] 这个势必会造成一个困惑,就是如果目标jvm进程已经先开始运行了,难不成卧底就监控不了了吗?这就好比一个小偷要去人家偷东西,难不成房子还没竣工,小偷就要去蹲点吗, 这显然是不合理的. jdk的开发团队也意识到了这个问题, 于是他们对jdk做了以下优化,提供了agentmain函数:(之前那个函数

(转)Java atomic原子类的使用方法和原理(一)

在讲atomic原子类之前先看一个小例子: public class UseAtomic { public static void main(String[] args) { AtomicInteger atomicInteger=new AtomicInteger(); for(int i=0;i<10;i++){ Thread t=new Thread(new AtomicTest(atomicInteger)); t.start(); try { t.join(0); } catch (I

java 变量及数据类型、原码、反码、补码

Java基础——变量及数据类型 变量的概念 内存中的一个存储区域 变量名+数据类型 可在同一类型范围内不断变化 为什么定义变量: 用于不断的存放同一类型的常量,并可以重复使用 使用变量注意: 变量的作用范围,一对{}之间有效 初始化值 定义变量的格式: 数据类型  变量名=初始化值 eg: int x = 4 注:格式固定 理解:变量就如同数学中的未知数. 数据类型: 整数默认类型为:int 小数默认类型为:double 占用内存及取值范围 整数默认类型为:int 小数默认类型为:double