为什么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.原理分析

首先,我们分别把123424021123456789转换为二进制形式:

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丢失精度的具体过程相关推荐

  1. golang中的json decode丢失精度的问题

    最近发现的一个坑 当用enconding/json包的时候,数字默认是处理为float64类型的,这就导致了int64可能会丢失精度,这时候要用dec.UseNumber将处理的数字转换成json.N ...

  2. Golang中int, int8, int16, int32, int64和uint区别

    Golang中int, int8, int16, int32, int64和uint区别 前言 测试 结果 结论 总结 前言 在学习go语言时,做算法题会很经常遇到go语言的各种int类型,为什么会有 ...

  3. Golang中 int int8 int16 int32 int64的区别和取值范围

    先说结论吧,方便快速查询验证. 总结 区别 int 类型大小为 8 字节 int8 类型大小为 1 字节 int16 类型大小为 2 字节 int32 类型大小为 4 字节 int64 类型大小为 8 ...

  4. Golang中int, int8, int16, int32, int64区别

    猫哥写Golang过程中,遇到整数常用int,因为可以少打至少一个字符. T_T 一直没有意识到其实各个int还是有区别的,起码是内存空间上的区别. 一段简单粗暴的程序,描述一下区别: package ...

  5. golang中int int8 int16 int32 int64 uint8 uint16 uint32 uint64 占用字节和取值范围

    ================================ go grpc-go 相关技术专栏 总入口   go语言基础知识总结.整理.收藏 ========================== ...

  6. Debeaver导入csv文件后处理乱码与数字型转varchar丢失精度问题

    Dbeaver目前只支持数据库表或者CSV导入犯事,此博客记录这个导入过程 一.解决中文乱码 1.csv或者excel数据放置好之后正常保存 2.后缀修改为txt,直接确定,不会丢失数据 3.不必使用 ...

  7. java小数丢失精度_Java中的小数运算与精度损失

    float.double类型的问题 我们都知道,计算机是使用二进制存储数据的.而平常生活中,大多数情况下我们都是使用的十进制,因此计算机显示给我们看的内容大多数也是十进制的,这就使得很多时候数据需要在 ...

  8. golang中builtin包说明

    builtin包是go的预声明定义,包括go语言中常用的各种类型和方法声明,包括变量和常量两部分.其详细声明在builtin.go文件中,链接:http://golang.org/src/builti ...

  9. 前端参数无法转为后端实体内部类_Spring Boot返回前端Long型丢失精度

    最近为Prong开发了一个基于snowflake算法的Java分布式ID组件,将实体主键从原来的String类型的UUID修改成了Long型的分布式ID.修改后发现前端显示的ID和数据库中的ID不一致 ...

最新文章

  1. 坑!只要年轻博士,薪资按考核结果发放, 高校的博后制度,究竟有多少门道?...
  2. python括号匹配算法_使用Python的栈实现括号匹配算法
  3. 强化学习核心文章一百篇
  4. FreeBSD设置IP地址,网关,DNS
  5. Win10自动更新关闭方法
  6. string[x]:size 属性具有无效大小值0
  7. 搞懂Java分布式锁实现看这篇文章就对了
  8. oracle 不等于某类,Oracle如何查询不等于某数值
  9. MySQL修改字符集
  10. Java中去除字符串中空格的方法
  11. itextpdf 实现html转pdf中中文及图片base64的解决方法
  12. 循环嵌套外小内大原则
  13. 蓝牙模块HC-06的基本设置和他的AT指令集
  14. 正弦积分与余弦积分函数
  15. c语言 游程编码,游程编码C语言.doc
  16. 计算机文件夹隐藏了怎么恢复,文件夹隐藏了怎么恢复,文件夹设为隐藏如何恢复...
  17. 围棋单机版-纵横十九道,迷煞多少人
  18. python处理pdf实例_详解Python使用PDFMiner解析PDF实例
  19. 配置计算机系统doc,计算机的基本配置.doc
  20. php 车架号校验规则,JAVASCRIPT车架号识别/验证函数代码 汽车车架号验证程序

热门文章

  1. wex导入mysql_数据库操作
  2. Out-projected type ... prohibits the use of 'public abstract fun success(e: E): Unit defined
  3. 思科交换机创建Vlan时出错的解决方法(一)
  4. 混合模式程序matlab,matlab作图色盘色调混合模式
  5. 什么是Http协议无状态?怎么解决Http无状态
  6. 17-基于51单片机的停车场车位管理系统
  7. 机票订购系统毕业设计
  8. 把驱动器变为U盘的方法(非一般性,可以一试
  9. Redis 删除Key命令会导致阻塞么?
  10. 私有化部署企业即时通讯(企业im)除了钉钉还有这些