go 中的uint16、int16 、int32区别和转换问题及其他细节理解

背景:这块因为与硬件打交道,涉及字节和位,所以写了这篇播客。

这块知识是很基础的,这块在大学大一或大二就学的知识,结果忘完了,由于之前使用的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,所以转换时要注意

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值