大家好,又见面了,我是你们的朋友全栈君
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...%b,%d\n",t2,t2,t2);
fmt.Printf("0x%x,%b,%d\n",t3,t3,t3);
运行的结果是:
2.原理分析
首先,我们分别把123424021和123456789转换为二进制形式...当从int32转换为int16时,Golang会截取后面的16位数字,两个数字的截取情况如下:
123424021截取0100110100010101
123456789截取1100110100010101...但是在无符号的二进制数中,我们可以把1100110100010101看作一个正数来处理,此时1100110100010101转换为十进制就是52501。