大家好,又见面了,我是你们的朋友全栈君

Int32转换为int16会丢失精度,这是总所周知的,但是具体如何丢失精度的,请看下面的代码:

运行的结果是:

2.原理分析

123424021123456789
123424021
123456789

其实在二进制形式下,上面的两个数字只有一个位是不同的,见上面粗体部分。

当从int32转换为int16时,Golang会截取后面的16位数字,两个数字的截取情况如下:

1234240210100110100010101
1234567891100110100010101

带符号的二进制数中,最高位为0表示该数字为正数,最高位为1表示该数字为负数,因此:

01001101000101011100110100010101
11001101000101011100110100010101

3.二进制正负数的转换运算

二进制的负数采用补码的方式来实现,运算规则是将正数取反后再加1,例子:

-1001000110010010011011‬10011100-100
1100110100010101100110100010101011001011101011‬‬-011001011101011-13035

转载于:https://my.oschina.net/cloes/blog/3004893