Golang中Int32转换为int16丢失精度的具体过程
为什么80%的码农都做不了架构师?>>>
1.类型转换代码
Int32转换为int16会丢失精度,这是总所周知的,但是具体如何丢失精度的,请看下面的代码:
var tmp1 int32 = 123424021
var tmp2 int16
var tmp3 uint16
tmp2 = int16(tmp1)
tmp3 = uint16(tmp1)
fmt.Printf("0x%x,%b,%d\n",tmp1,tmp1,tmp1);
fmt.Printf("0x%x,%b,%d\n",tmp2,tmp2,tmp2);
fmt.Printf("0x%x,%b,%d\n",tmp3,tmp3,tmp3);fmt.Printf("====================================\n")var t1 int32 = 123456789
var t2 int16
var t3 uint16
t2 = int16(t1)
t3 = uint16(t1)
fmt.Printf("0x%x,%b,%d\n",t1,t1,t1);
fmt.Printf("0x%x,%b,%d\n",t2,t2,t2);
fmt.Printf("0x%x,%b,%d\n",t3,t3,t3);
运行的结果是:
2.原理分析
首先,我们分别把123424021
和123456789
转换为二进制形式:
123424021
的二进制形式111010110110100110100010101
123456789
的二进制形式111010110111100110100010101
其实在二进制形式下,上面的两个数字只有一个位是不同的,见上面粗体部分。
当从int32转换为int16时,Golang会截取后面的16位数字,两个数字的截取情况如下:
123424021
截取0100110100010101
123456789
截取1100110100010101
在带符号的二进制数中,最高位为0表示该数字为正数,最高位为1表示该数字为负数,因此:
0100110100010101
是一个正数,1100110100010101
是一个负数。
但是在无符号的二进制数中,我们可以把1100110100010101
看作一个正数来处理,此时1100110100010101
转换为十进制就是52501。
3.二进制正负数的转换运算
二进制的负数采用补码的方式来实现,运算规则是将正数取反后再加1,例子:
假如我们要表示-100
,首先,100
的二进制形式是01100100
,我们对其近期取反操作10011011
,然后再进行加一操作后,得到的结果就是10011100
,这个就是-100
的二进制形式。
结合上面的例子,1100110100010101
是一个负数,将100110100010101
其按照上面的规则进行逆运算,得到的结果是011001011101011
,就是上面截图中的-011001011101011
,转换为十进制就是-13035
。
转载于:https://my.oschina.net/cloes/blog/3004893
Golang中Int32转换为int16丢失精度的具体过程相关推荐
- golang中的json decode丢失精度的问题
最近发现的一个坑 当用enconding/json包的时候,数字默认是处理为float64类型的,这就导致了int64可能会丢失精度,这时候要用dec.UseNumber将处理的数字转换成json.N ...
- Golang中int, int8, int16, int32, int64和uint区别
Golang中int, int8, int16, int32, int64和uint区别 前言 测试 结果 结论 总结 前言 在学习go语言时,做算法题会很经常遇到go语言的各种int类型,为什么会有 ...
- Golang中 int int8 int16 int32 int64的区别和取值范围
先说结论吧,方便快速查询验证. 总结 区别 int 类型大小为 8 字节 int8 类型大小为 1 字节 int16 类型大小为 2 字节 int32 类型大小为 4 字节 int64 类型大小为 8 ...
- Golang中int, int8, int16, int32, int64区别
猫哥写Golang过程中,遇到整数常用int,因为可以少打至少一个字符. T_T 一直没有意识到其实各个int还是有区别的,起码是内存空间上的区别. 一段简单粗暴的程序,描述一下区别: package ...
- golang中int int8 int16 int32 int64 uint8 uint16 uint32 uint64 占用字节和取值范围
================================ go grpc-go 相关技术专栏 总入口 go语言基础知识总结.整理.收藏 ========================== ...
- Debeaver导入csv文件后处理乱码与数字型转varchar丢失精度问题
Dbeaver目前只支持数据库表或者CSV导入犯事,此博客记录这个导入过程 一.解决中文乱码 1.csv或者excel数据放置好之后正常保存 2.后缀修改为txt,直接确定,不会丢失数据 3.不必使用 ...
- java小数丢失精度_Java中的小数运算与精度损失
float.double类型的问题 我们都知道,计算机是使用二进制存储数据的.而平常生活中,大多数情况下我们都是使用的十进制,因此计算机显示给我们看的内容大多数也是十进制的,这就使得很多时候数据需要在 ...
- golang中builtin包说明
builtin包是go的预声明定义,包括go语言中常用的各种类型和方法声明,包括变量和常量两部分.其详细声明在builtin.go文件中,链接:http://golang.org/src/builti ...
- 前端参数无法转为后端实体内部类_Spring Boot返回前端Long型丢失精度
最近为Prong开发了一个基于snowflake算法的Java分布式ID组件,将实体主键从原来的String类型的UUID修改成了Long型的分布式ID.修改后发现前端显示的ID和数据库中的ID不一致 ...
最新文章
- 坑!只要年轻博士,薪资按考核结果发放, 高校的博后制度,究竟有多少门道?...
- python括号匹配算法_使用Python的栈实现括号匹配算法
- 强化学习核心文章一百篇
- FreeBSD设置IP地址,网关,DNS
- Win10自动更新关闭方法
- string[x]:size 属性具有无效大小值0
- 搞懂Java分布式锁实现看这篇文章就对了
- oracle 不等于某类,Oracle如何查询不等于某数值
- MySQL修改字符集
- Java中去除字符串中空格的方法
- itextpdf 实现html转pdf中中文及图片base64的解决方法
- 循环嵌套外小内大原则
- 蓝牙模块HC-06的基本设置和他的AT指令集
- 正弦积分与余弦积分函数
- c语言 游程编码,游程编码C语言.doc
- 计算机文件夹隐藏了怎么恢复,文件夹隐藏了怎么恢复,文件夹设为隐藏如何恢复...
- 围棋单机版-纵横十九道,迷煞多少人
- python处理pdf实例_详解Python使用PDFMiner解析PDF实例
- 配置计算机系统doc,计算机的基本配置.doc
- php 车架号校验规则,JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序
热门文章
- wex导入mysql_数据库操作
- Out-projected type ... prohibits the use of 'public abstract fun success(e: E): Unit defined
- 思科交换机创建Vlan时出错的解决方法(一)
- 混合模式程序matlab,matlab作图色盘色调混合模式
- 什么是Http协议无状态?怎么解决Http无状态
- 17-基于51单片机的停车场车位管理系统
- 机票订购系统毕业设计
- 把驱动器变为U盘的方法(非一般性,可以一试
- Redis 删除Key命令会导致阻塞么?
- 私有化部署企业即时通讯(企业im)除了钉钉还有这些