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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 华为服务器安装nas系统,云服务器搭建nas

    华为服务器安装nas系统,云服务器搭建nas云服务器搭建nas内容精选换一换在云服务器上搭建网站后,部分客户通过本地网络访问网站时出现偶发性无法访问的情况。确认客户使用的本地网络。若客户的本地网络是NAT网络(本地主机通过NAT功能使用公网IP地址访问弹性云服务器),可能会导致该问题。若客户的本地网络是NAT网络(本地主机通过NAT功能使用公网IP地址访问弹性云服务器),可能会导致该问题。执行以下命令,查看搭建网在云服务器上搭建网站后,部…

    2022年6月15日
    57
  • Java static(三) – 静态代码块

    Java static(三) – 静态代码块静态代码块static代码块也叫静态代码块,是在类中独立于类成员的static语句块,可以有多个,位置可以随便放,它不在任何的方法体内JVM加载类时会执行这些静态代码块,如果static代码块有多个,JVM将按照它们在类中出现的先后顺序依次执行它们每个静态代码块只会被执行一次实例说明//父类publicclassParentStatic{privatestaticStringpstr=”父类静态变量”;static{System.o.

    2022年7月16日
    18
  • 二进制与或非逻辑计算机,深度学习(1):给感知机做准备,谈谈二进制和与或非门。…

    二进制与或非逻辑计算机,深度学习(1):给感知机做准备,谈谈二进制和与或非门。…过去的五年 人工智能已经是最热门的话题 从理论的完善到实践工具的丰富 慢慢发现 AI 已不再是专属于实验室的一种研究 每一个对此有兴趣的人都能自己动手在自己的电脑上完成属于自己的研究 本系列文章希望从零起步 帮助建立从理论到实践的深度学习知识 而读者不必担心自己的知识储备 只要你会打开电脑从头开始看就足以完成学习 万事开头难 实现人工智能的第一步 我准备先谈谈感知机 Perceptron 的实现 而

    2025年9月4日
    2
  • java流操作对文件的分割和合并

    学习文件的输入输出流,自己做一个小的示例,对文件进行分割和合并。

    2022年2月24日
    44
  • delphi字符函数Copy,Pos,Quotedstr

    delphi字符函数Copy,Pos,Quotedstr———————————————————————————————-Posfunction  Returnstheindexvalueofthefirstcharacterinaspecifiedsubstringthatoccursin

    2022年10月17日
    4
  • return 、break和continue的区别和作用

    return 、break和continue的区别和作用return、break和continue的区别和作用1.return关键字并不是专门用于跳出循环的,return的功能是结束一个方法。一旦在循环体内执行到一个return语句,return语句将会结束该方法,循环自然也随之结束。与continue和break不同的是,return直接结束整个方法,不管这个return处于多少层循环之内。publicclassReturnT

    2022年5月1日
    37

发表回复

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

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