以下代码存在问题:
var x uint64 = 18446744073709551615
var y int64 = int64(x)
y
是-1
。在不丢失信息的情况下,是否可以在这两种数字类型之间进行转换以使用编码器和解码器?
buff bytes.Buffer
Encoder(buff).encode(x)
Decoder(buff).decode(y)
注意,在典型情况下,我没有尝试直接数字转换。我更关注维护随机数生成器的统计属性。
答案 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位运行(因此这个答案),但后来认识到18446744073709551615
是0xffffffffffffffff
( -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。