背景:这块因为与硬件打交道,涉及字节和位,所以写了这篇播客。
这块知识是很基础的,这块在大学大一或大二就学的知识,结果忘完了,由于之前使用的java,不需要这些细节,所有一直没有深入,现在go语言有这个区分,还是好好学学理解消化一下。
首先解释下什么是无符合和有符号,有符号是包含负数的,无符号是非负数之外的数据。
基础普及:
1、位(bit)
来自英文bit,音译为“比特”,表示二进制位。位是计算机内部数据储存的最小单位,11010100是一个8位二进制数。一个二进制位只可以表示0和1两种状态(21);两个二进制位可以表示00、01、10、11四种(22)状态;三位二进制数可表示八种状态(23)……。2、字节(byte)
字节来自英文Byte,音译为“拜特”,习惯上用大写的“B”表示。
字节是计算机中数据处理的基本单位。计算机中以字节为单位存储和解释信息,规定一个字节由八个二进制位构成,即1个字节等于8个比特(1Byte=8bit)。八位二进制数最小为00000000,最大为11111111;通常1个字节可以存入一个ASCII码,2个字节可以存放一个汉字国标码。3、字
计算机进行数据处理时,一次存取、加工和传送的数据长度称为字(word)。一个字通常由一个或多个(一般是字节的整数位)字节构成。例如286微机的字由2个字节组成,它的字长为16;486微机的字由4个字节组成,它的字长为32位机。
计算机的字长决定了其CPU一次操作处理实际位数的多少,由此可见计算机的字长越大,其性能越优越。
int8 int16 int32 int64,这里面的数字是位,就是8位、16位、32位、64位,转换字节,是每八位代表一字节,8位、16位、32位、64位 对应字节分别是1字节 、2字节、4字节、8字节
上面都是大学知识啊,现在还得去理解,所以说大学学习还是重要的,否则工作后还得学。
接下来用go来进行理解这块哈
举个例子:
int8 int16 int32 int64 都是有符号的,看go的解释:
发现没,包含负数
uint8 uint16 uint32 uint64 都是无符号的,看go的解释:
都是0到多少多少,
如果赋值负数编辑器会提示报错
咱们用代码跑一下看看效果:
从实际上看也是这样的,特别提醒,int 和unit默认是64位 8字节,也就是默认的是int64
接下来咱们考虑另外一个问题,转换问题,既然有区分,那么转换就要注意了:
我个人理解:
1、 无符号类型的数据可以直接强转有符号类型即可,因为有符号的数据范围大于无符号的,代码测试:
使用uint16 直接可以转换成int16
如果int16 转换uint16:
如果是int16是>=0的,是正常能获取正常值的
如果int16<0, 无法标识,因为最高位被解释为符号位。这个还是了解不够彻底,等后续了解清楚了,在进行补充。
2、低范围转换高范围的也是可以直接转换的
例如unit16 转换为unit32可以直接转换,因为低范围可以直接转换到高范围。同理 int16直接转换int32,其他类型也是可以的。
特别说明:
高范围转换低范围,超过的值默认给该类型最大值,例如uint16最大值是65535,所以转换时要注意