在不丢失信息的情况下将 uint64 转换为 int64

以下代码的问题:


var x uint64 = 18446744073709551615

var y int64 = int64(x)

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


buff bytes.Buffer

Encoder(buff).encode(x)

Decoder(buff).decode(y)

请注意,在您的典型情况下,我不会尝试进行直接的数字转换。我更关心维护随机数生成器的统计属性。


慕的地10843
浏览 469回答 3
3回答

慕勒3428872

看到 -1 将与以 32 位运行的进程一致。参见例如Go1.1 发行说明(介绍uint64)x := ^uint32(0) // x is 0xffffffffi := int(x)     // i is -1 on 32-bit systems, 0xffffffff on 64-bitfmt.Println(i)使用fmt.Printf("%b\n", y)可以帮助了解发生了什么(参见ANisus的回答)事实证明,OPwheaties确认(在评论中)它最初以 32 位运行(因此是这个答案),但后来意识到18446744073709551615是0xffffffffffffffff(-1):见ANisus答案;

鸿蒙传说

uint64 和 int64 类型都可以表示 2^64 个离散整数值。两者之间的区别在于 uint64 仅保存正整数(0 到 2^64-1),而 int64 使用 1 位保存正整数和负整数(-2^63 到 2^63-1) .正如其他人所说,如果您的生成器正在生产0xffffffffffffffff,则 uint64 会将其表示为原始整数 (18,446,744,073,709,551,615) 而 int64 将解释二进制补码值并返回 -1。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go