目录
一、scala中的整形类型
分为:Byte,Short,Int,Long,如下图:
数据类型 | 描述 |
Byte[1] | 8 位有符号补码整数,数据值范围为-128到127 |
Short[2] | 16 位有符号补码整数,数据值范围为-32768到32767 |
Int[4] | 32 位有符号补码整数,数据值范围为-2147483648-2147483647 |
Long[8] | 64 位有符号补码整数,数据值范围为-9223372036854775808到9223372036854775807 2的64次方-1 |
二、关于原码、反码、补码
原码:一个数在计算机中的二进制形式,最高位表示符号位,1 表示 负,0 表示 正
[ 1 ]原 = 0000 0001
[ -1 ]原 = 1000 0001
反码:正数的反码与原码相同,负数的反码是在原码的基础上,符号位不变,其它各位取反(1 变 0,0 变 1)
[ 1 ]反 = 0000 0001
[ -1 ]反 = 1111 1110
补码:正数的补码与原码相同,负数的补码:反码 + 1
[ 1 ]补 = 0000 0001
[ -1 ]补 = 1111 1111
三、计算机运算
计算机内部采用补码的方式存储有符号的数据,采用补码的方式进行运算
原码运算:
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [1000 0010]原 = -2
补码计算:
1 - 1 = 1 + (-1) = [0000 0001]原 + [1000 0001]原 = [0000 0001]反 + [1111 1110]反 = [0000 0001]补 + [1111 1111]补 = [0000 0000]补 = 0
四、为什么byte类型的范围是-128到127呢
因为是有符号型的,所以第一位表示正负,后面7位表示数据,按照正常表示是-127到127
但是比如0
正0表示 0000 0000
负0表示 1 000 0000 反码:1111 1111 补码:反码+1 1000 0000
有两个0
所以1 000 0000 就表示-128 -128只有补码,没有原码和反码
其实这也是根据计算机内部运算计算而来的
比如-127 原码表示:1 111 1111 补码:取反+1 则为:1 000 0001 那么 -127-1 = -128 则为:1000 0000 符合计算规则。
再比如-126 原码表示:1 111 1110 补码:取反+1 后为 1 000 0010 -127+1 就是-126
五、实例
1、1+127 等于多少呢?
原码0000 0001 +原码011111111 = 补码 0000 0001+补码 0111 1111 = 1000 0000 = -128
代码运行下:
var b:Byte = 127
var c:Byte=(b+1).toByte
println(c)
结果:-128
2、Int 130转换为Byte等于多少呢?
var m:Int = 130
println(m.toByte)
计算机底层是按照字节保存有符号,底层是补码,强制转码,直接截取
我们首先分析Int 128 转换为Byte是多少呢
Int 128原码:0000 0000 0000 0000 0000 0000 1000 000
补码:0000 0000 0000 0000 0000 0000 1000 000
截取最后一个字节:
1000 000
取反+1
补码:10000 0000
结果是-128
再看看130
原码: 000000000 000000000 000000000 1 0000010
补码:000000000 000000000 000000000 1 0000010
补码:10000 0010
有两种方式;
1、可以看出1000 0000+2=1000 0010 也就是-128+2=-126
2、原码:取反+1 11111101 +1 = 11111110
所以结果是-126