Go:将uint64转换为int64而不会丢失信息

时间:2014-11-13 14:03:50

标签: random go int64 uint64

以下代码存在问题:

var x uint64 = 18446744073709551615
var y int64 = int64(x)

y-1。在不丢失信息的情况下,是否可以在这两种数字类型之间进行转换以使用编码器和解码器?

buff bytes.Buffer
Encoder(buff).encode(x)
Decoder(buff).decode(y)

注意,在典型情况下,我没有尝试直接数字转换。我更关注维护随机数生成器的统计属性。

3 个答案:

答案 0 :(得分:13)

您的转化不会丢失转化中的任何信息。所有的比特都不会受到影响。就是这样:

uint64(18446744073709551615) = 0xFFFFFFFFFFFFFFFF
int64(-1)                    = 0xFFFFFFFFFFFFFFFF

尝试:

var x uint64 = 18446744073709551615 - 3

您将拥有y = -4


例如:playground

var x uint64 = 18446744073709551615 - 3
var y int64 = int64(x)
fmt.Printf("%b\n", x)
fmt.Printf("%b or %d\n", y, y)

输出:

1111111111111111111111111111111111111111111111111111111111111100
-100 or -4

答案 1 :(得分:5)

看到-1将与运行为32位的进程一致。

例如,请参阅Go1.1 release notes(介绍uint64

x := ^uint32(0) // x is 0xffffffff
i := int(x)     // i is -1 on 32-bit systems, 0xffffffff on 64-bit
fmt.Println(i)

使用fmt.Printf("%b\n", y)有助于查看正在发生的事情(请参阅ANisus' answer

事实证明,OP wheaties确认(in the comments)它最初以32位运行(因此这个答案),但后来认识到184467440737095516150xffffffffffffffff( -1)无论如何:见ANisus answer;

答案 2 :(得分:0)

类型uint64和int64都可以表示2 ^ 64个离散整数值。

两者之间的区别在于uint64只保留正整数(0到2 ^ 64-1),其中int64使用1位保持符号的正负整数(-2 ^ 63到2 ^ 63) -1)。

正如其他人所说,如果你的生成器正在生成Alamofire,uint64将把它表示为原始整数(18,446,744,073,709,551,615),而int64将解释two's complement值并返回-1。