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

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)


Von*_*onC 5

看到-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位(因此此答案)最初运行,但随后实现184467440737095516150xffffffffffffffff(-1)的反正:见答案 ;