以下代码的问题:var x uint64 = 18446744073709551615var y int64 = int64(x)是,y是-1。在不丢失信息的情况下,在这两种数字类型之间进行转换的唯一方法是使用编码器和解码器吗?buff bytes.BufferEncoder(buff).encode(x)Decoder(buff).decode(y)请注意,在您的典型情况下,我不会尝试进行直接的数字转换。我更关心维护随机数生成器的统计属性。
3 回答
慕勒3428872
TA贡献1848条经验 获得超6个赞
看到 -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)
使用fmt.Printf("%b\n", y)可以帮助了解发生了什么(参见ANisus的回答)
事实证明,OPwheaties确认(在评论中)它最初以 32 位运行(因此是这个答案),但后来意识到18446744073709551615是0xffffffffffffffff(-1):见ANisus答案;
鸿蒙传说
TA贡献1865条经验 获得超7个赞
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。
- 3 回答
- 0 关注
- 468 浏览
添加回答
举报
0/150
提交
取消