计算机中int、byte值转换分析,原码补码分析
object Test07_TypeCast {
def main(args: Array[String]): Unit = {
// 将int值130强转为byte 值为多少
// 0000 0000 1000 0010 => 表示int的130
val i4 = 130
// 1000 0010 => 表示byte的130
/**
* 个人理解:
* 1000 0010看起来像是-2,那么它是-2吗。此时只需要看一个数 1000 0000 是多少 难道是-0吗
* 在微积分里面确实有-0和+0的一个区别,但是计算机达不到这个高度,没有我们想象中的那么厉害
* 计算机的数学维度非常的低,他的数学水平相当于高中,它一点微积分都不会,他只能表示有限的数,不能表示无限
* 所以-0在计算机里面没有意义,对于计算机来说-0就是0. 如果1000 0000表示-0的话,就和0000 0000这个数冲突了
* 那么256个byte数就会少一个,所以在定义的时候计算机是不会把1000 0000当作一个-0的,还有一点,计算机比较笨,
* 他的逻辑思维根本就不如我们,在我们的世界里面正数,负数非常明确,还有绝对值的概念。
* 但是计算机他不行,他只有一个逻辑,那就是1比0大,因为计算机他就是底层的数字电路二进制组成的,在它眼里只有1和 0
* 那它就认为1比0要大,所以它就认为1000 0001比1000 0000大,因为前者有个1,它就认为1比0大,它就这么一个脑子
* 我们写的数1000 0010比它们两个都要大,就这样一直大下去会变成1111 1111,那他就是负数里面最大的数,
* 可是负数里面最大的数是-1,那1111 1111就是-1;1000 0000就成了负数里面最小的数了,也就是-128
* 所以1000 0010比1000 0000大2,那么1000 0010就是-126
*
* 官方的语言,1000 0010叫做补码;计算机在存负数的时候采用的是补码的方式
* 我们再看补码的时候需要将补码转化为原码才表示它的一个数字
* 补码转化成原码的方式 -1取反
* 减一取反 减一的时候得到的是反码1000 0001,然后取反变成原码1111 1110(符号位保持不变)就是126
* 原码转化成补码的方式 取反+1
* 其实,若是琢磨一下,就会发现,这两个方法是一样的,先取反再加一和先减一再取反其实是一回事
* 一个属1101取反就是0010,它两相加不就是全为1了吗
* 那一个byte 它取反是什么意思呢,它取反相加就变成11111111也就是127了
* 一个byte数取反就是拿127减这个数
* 所以原码求补码 取反再加一 就是127-x+1也就是128—x
* 那么补码求反码 先减一再取反就是127—(x-1)还是128-x
*
* 之后,拿128减它就可以了
*
*/
println(i4.toByte)
}
}