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


相关推荐

  • c++计算程序运行时间_程序设计5个基本步骤

    c++计算程序运行时间_程序设计5个基本步骤注意:控制台需要加 #include “atltime.h” 头文件#include “stdafx.h” #include “atltime.h”#include <iostream>using namespace std; int _tmain(int argc, _TCHAR* argv[]){ CString strTime; //用于将CTime对象格式…

    2022年8月18日
    9
  • django官方入门教程_DJango

    django官方入门教程_DJangoDjango入门教程Django是一个开放源代码的Web应用框架,由Python写成。采用了MTV的框架模式,即模型M,模板T和视图V。其最大特点自带一个后台管理系统,可以让只要少量代码就能实现后台管理,尤其适合内容管理网站(如博客,新闻,公司首页等信息类网站),适合中小型web网站。Django基本介绍Django安装HelloDjango开发工具

    2025年10月1日
    4
  • stm32新手入门什么是寄存器_STM32H7寄存器

    stm32新手入门什么是寄存器_STM32H7寄存器小白单片机入门必看,俗话说得好基础不牢地动山摇,要学好单片机一定要熟知底层原理

    2025年9月24日
    7
  • Java四舍五入保留小数点后几位

    Java四舍五入保留小数点后几位(double)+Math.round返回double类型//案例:四舍五入保留小数点后1位doubled1=123.456;doubled2=654.321;doublev1=(double)Math.round(d1*10)/10;doublev2=(double)Math.round(d2*10)/10;System.out…

    2022年5月21日
    47
  • 学习笔记:ssh远程连接root登陆失败,ssh双端口策略,xshell上传下载文件,服务升级备份包,

    学习笔记:ssh远程连接root登陆失败,ssh双端口策略,xshell上传下载文件,服务升级备份包,遇到无法进行ssh远程传输服务时候检查一下配置文件 vim /etc/ssh/sshd_config 中的permissRootLogin 是不是no 改为yes重启sshd服务即可ssh服务一般开两个端口一个默认22一个5222(避免远程关闭端口后断开连接,无法登录)XShell建立连接后rz命令上传文件到linuxsz命令下载文件到window对服务进行升级后建议打包两个文件,一个带有配置文件(用于没有该服务的机器的服务安装),一个不带配置文件(x,用于其他已有该服务.

    2022年8月11日
    6
  • 配置NFS固定端口[通俗易懂]

    配置NFS固定端口[通俗易懂]NFS启动时会随机启动多个端口并向RPC注册,为了设置安全组以及iptables规则,需要设置NFS固定端口。NFS服务需要开启mountd,nfs,nlockmgr,portmapper,rquotad这5个服务,其中nfs、portmapper的端口是固定的,另外三个服务的端口是随机分配的,所以需要给mountd,nlockmgr,rquotad设置固定的端口。其中,给mountd、rq…

    2022年6月27日
    157

发表回复

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

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