为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
慕的地10843 2021-08-30 15:05:35
以下代码的问题: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答案;


查看完整回答
反对 回复 2021-08-30
?
鸿蒙传说

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。


查看完整回答
反对 回复 2021-08-30
  • 3 回答
  • 0 关注
  • 468 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信