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

Random Go:在不丢失信息的情况下将uint64转换为int64,random,go,int64,uint64,Random,Go,Int64,Uint64,以下代码的问题: var x uint64 = 18446744073709551615 var y int64 = int64(x) 是不是y是-1。在不丢失信息的情况下,使用编码器和解码器在这两种数字类型之间进行转换的唯一方法是什么 buff bytes.Buffer Encoder(buff).encode(x) Decoder(buff).decode(y) 注意,在您的典型案例中,我并没有尝试直接的数字转换。我更关心的是维护随机数生成器的统计特性。看到-1与32位运行的进程是一致的

以下代码的问题:

var x uint64 = 18446744073709551615
var y int64 = int64(x)
是不是
y
-1
。在不丢失信息的情况下,使用编码器和解码器在这两种数字类型之间进行转换的唯一方法是什么

buff bytes.Buffer
Encoder(buff).encode(x)
Decoder(buff).decode(y)

注意,在您的典型案例中,我并没有尝试直接的数字转换。我更关心的是维护随机数生成器的统计特性。

看到-1与32位运行的进程是一致的

例如,请参见(它引入了
uint64

使用
fmt.Printf(“%b\n”,y)
可以帮助查看发生了什么(请参见“)


结果是,确认()它最初是以32位运行的(因此是这个答案),但随后实现
18446744073709551615
0xffffffffffff
(-1):请参阅

您的转换不会丢失转换中的任何信息。所有的位子都不会动。只是:

uint64(18446744073709551615) = 0xFFFFFFFFFFFFFFFF
int64(-1)                    = 0xFFFFFFFFFFFFFFFF
尝试:

您将拥有
y=-4


例如:

输出:

1111111111111111111111111111111111111111111111111111111111111100
-100 or -4

uint64和int64类型都可以表示2^64个离散整数值

两者之间的区别在于uint64只保存正整数(0到2^64-1),其中as int64使用1位保存符号(-2^63到2^63-1),同时保存负整数和正整数


正如其他人所说,如果生成器生成的是
0xffffffffffff
,uint64将表示为原始整数(18446744073709551615),而int64将解释该值并返回-1。

y是-1?你的操作系统是32位还是64位?对那个投票否决我的人来说,为什么要投票否决@VonC 64位。我没有投反对票(这里是一张赞成票)。我之所以询问操作系统,是因为,在32位操作系统中只看到-1。@VonC我会的。我打赌我们已经把这个清漆设置为32位!如果不是-1,您希望
y
是什么?您希望在转换后断言
x==y
,如果没有,则会出现错误/死机?在64位机器上的Varnish之外运行,我仍然看到它。它没有引起溢出恐慌,但它返回了
-1
,这几乎破坏了所有位的随机性。@wheaties好的,我在阅读后提到了这种可能性,我有点不知道你们两个中的哪一个给出了答案。你实际上是指我在32位设置中运行Varnish,这表明它总是会出来的-1当ANisus陈述显而易见的情况时,我只是根据32位系统的经验得出了错误的结论。@wheaties我用一个游乐场示例完成了ANisus的答案。问题是否改变了?我不明白这个答案和这个问题有什么关系。我有点不知道你们两个中的哪一个能给出答案。你正确地指出我错误地将-1解释为它不是的东西。然而,错误的解释是在32位设置中运行Varnish的直接结果。我想我需要把它给VonC,但希望我能给你更多+1.18446744073709551615是0xffffffffffffffff@Anonymous:谢谢你的注意。添加了缺少的F
var x uint64 = 18446744073709551615 - 3
var x uint64 = 18446744073709551615 - 3
var y int64 = int64(x)
fmt.Printf("%b\n", x)
fmt.Printf("%b or %d\n", y, y)
1111111111111111111111111111111111111111111111111111111111111100
-100 or -4