whe*_*ies 6 random go int64 uint64
以下代码的问题:
var x uint64 = 18446744073709551615
var y int64 = int64(x)
Run Code Online (Sandbox Code Playgroud)
是,y是-1.在不丢失信息的情况下,是否可以在这两种数字类型之间进行转换以使用编码器和解码器?
buff bytes.Buffer
Encoder(buff).encode(x)
Decoder(buff).decode(y)
Run Code Online (Sandbox Code Playgroud)
请注意,在典型情况下,我没有尝试直接数字转换.我更关心的是保持随机数发生器的统计特性.
ANi*_*sus 13
您的转化不会丢失转化中的任何信息.所有的比特都不会受到影响.就是这样:
uint64(18446744073709551615) = 0xFFFFFFFFFFFFFFFF
int64(-1) = 0xFFFFFFFFFFFFFFFF
Run Code Online (Sandbox Code Playgroud)
尝试:
var x uint64 = 18446744073709551615 - 3
Run Code Online (Sandbox Code Playgroud)
你会的y = -4.
例如:游乐场
var x uint64 = 18446744073709551615 - 3
var y int64 = int64(x)
fmt.Printf("%b\n", x)
fmt.Printf("%b or %d\n", y, y)
Run Code Online (Sandbox Code Playgroud)
输出:
1111111111111111111111111111111111111111111111111111111111111100
-100 or -4
Run Code Online (Sandbox Code Playgroud)
看到-1将与运行为32位的进程一致.
例如,参见Go1.1发行说明(介绍uint64)
x := ^uint32(0) // x is 0xffffffff
i := int(x) // i is -1 on 32-bit systems, 0xffffffff on 64-bit
fmt.Println(i)
Run Code Online (Sandbox Code Playgroud)
使用fmt.Printf("%b\n", y)可以帮助查看正在发生的事情(请参阅ANisus的回答)
事实证明,在OP麦片确认(评价)它是在32位(因此此答案)最初运行,但随后实现18446744073709551615是0xffffffffffffffff(-1)的反正:见蚤答案 ;