java正数变负数变成正数 java中金额为负数设置方法( 二 )


这个时候就遇到了一个特殊的情况也就是 -128 的来源 。因为 +0 和 -0 是一样的 。但是对于 0 带符号来说没有意义 。而且会有 [0000 0000] 和 [1000 0000] 两个原码 。所以也就有了现在的补码 。
补码是为了解决 0 的符号两个编码的问题 。在补码运算中 [1000 0000] 就是 -128 。也就得出来了我们的输出值 -128 。
让我们看一下 129 的计算方式:
首先知道 129 的二进制是 [1000 0001] , 转换成 8 bit之后就变成首尾符号位为负数 , 
然后得出补码 [11111 1111] 也就是 -127 了 。
从这里我们也就可以根据补码知道了 byte 数据类型的取值范围:
[1111 1111] ~ [0111 1111] 也就是 -128 ~ 127 。
这里总结一下原码 ,  反码 , 补码的大概含义 。
原码:原码就是用第一位表示符号 , 其余位表示值 , 就如同上面的 16 位 [0000 0000 1000 0001] 。
反码: 正数的反码是原码本身 ,  负数的反码是在原码的基础上 ,  其余各个位取反 。
上面的值就变成:[0000 0000 1000 0001]
补码:正数的补码就是其本身 ,  负数的补码就是在原码的基础上 ,  其余的各位都取反 , 并在最后一位 + 1 。也就是在反码的基础上 +1 。
最终的补码变成:[0000 0000 1000 0001] 也就是129 。
从这里也就可以看出来 ,  我们在进行数据处理的时候尽量不要用位数大的数据类型转换成小的数据类型 ,  除非你很清楚这样转换没有问题 。
浮点类型的强制转换
以上说的都是整数的强制转换问题 ,  浮点型的也可以转换 。这里做两个演示 。
这里就是要引入浮点和整型进行转换或者运算的时候出现的问题 。对于金融来说 ,  很少使用 float 和 double 进行运算和使用 。推荐使用 BigDecimal 对象 。具体为什么 。了解原理可以参阅 : IEEE 754标准 。后期有时间再写一篇详细的原因 。主要还是二进制位的运算区别 。
数据类型的转换 ,  先说到这里吧 。关注我 。后续更多基础到实战的内容 。虽慢但永不停更 。