Golang中Int32转换为int16丢失精度的具体过程

Golang中Int32转换为int16丢失精度的具体过程为什么80%的码农都做不了架构师?>>>…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE使用 1年只要46元 售后保障 童叟无欺

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);

运行的结果是:

Golang中Int32转换为int16丢失精度的具体过程

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

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/170554.html原文链接:https://javaforall.net

(0)
上一篇 2022年8月15日 上午9:16
下一篇 2022年8月15日 上午9:16


相关推荐

  • 哈希和一致性哈希算法

    哈希和一致性哈希算法哈希Hash算法介绍哈希算法也叫散列算法,不过英文单词都是Hash,简单一句话概括,就是可以把任意长度的输入信息通过算法变换成固定长度的输出信息,输出信息也就是哈希值,通常哈希值的格式是16进制或者是10进制,比如下面的使用md5哈希算法的示例md5(“123456”)=>”e10adc3949ba59abbe56e057f20f883e”主要特点:•不可逆从哈希值不能推导出原始数据,所以Hash算法广泛应用在现代密码体系中•无碰撞不同的信息进行哈希后

    2022年7月27日
    7
  • Linux磁盘挂载

    Linux磁盘挂载一 挂载 U 盘 1 插入 U 盘 打开 Linux 终端 2 输入命令 sudofdisk l 从返回结果中可查看 U 盘分区名称 比如 sdb3 输入命令 sudomount dev sdb mnt4 输入命令 cd mnt 即可进入 U 盘二 新增磁盘挂载 1 查看新增磁盘的分区名 sudofdisk l 比如 dev sdb2 对硬盘进行分区 sudofdisk dev sdb 输入参数 m 显示帮助可不输

    2026年3月19日
    1
  • jedis连接redis集群中的一台无法操作?_jedis连接redis哨兵

    jedis连接redis集群中的一台无法操作?_jedis连接redis哨兵jedis连接redis集群

    2025年10月12日
    6
  • linux安装pip3命令(pip3 install报错)

    1.首先安装setuptools  小伙伴们可以通过官方模块库来下载:https://pypi.python.org/pypi  这里我就直接用wget到服务器上下载了版本为19.6(小伙伴们可以尝试新的版本奥。。)wget–no-check-certificatehttps://pypi.python.org/packages/source/s/setuptools/setuptools…

    2022年4月11日
    776
  • prefetch 和preload_prefetch和preload

    prefetch 和preload_prefetch和preload前面的话基于 VUE 的前端小站改造成 SSR 服务器端渲染后 HTML 文档会自动使用 preload 和 prefetch 来预加载所需资源 本文将详细介绍 preload 和 prefetch 的使用资源优先级在介绍 preload 和 prefetch 之前 首先要介绍浏览器的资源优先级在 Chrome 浏览器中 不同的资源在浏览器渲染的不同阶段进行加载的优先级不同一共分成五个级别 Highest 最高 Hight 高 Medium

    2026年3月26日
    1
  • Android面试题大全(中高级)

    Android面试题大全(中高级)1.synchronized和lock的区别答:https://blog.csdn.net/u012403290/article/details/64910926?locationNum=11&fps=1还可以去了解什么是可重入锁,公平锁,可中断锁。2.okhttp源码分析答:https://blog.csdn.net/mwq384807683/article…

    2022年5月22日
    28

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号