在围棋中,你应该在什么时候使用uint和int



乍一看,当您需要一个不想为负数的int时,似乎可以选择uint。然而,在实践中,int似乎总是首选的。

我看到的一般建议如下:

  • "一般来说,如果你使用整数,你应该只使用int类型">
  • "uint通常应该只用于进行二进制运算">
  • "不要使用无符号类型来强制或建议数字必须为正。这不是他们的目的">
  • "这就是Go编程语言所推荐的,当你想进行逐位操作时,uints的具体例子很有用

我还注意到Go可以让你将负int转换为uint,并给出一些奇怪的结果:

x := -5
y := uint(x)
fmt.Println(y)
>> 18446744073709551611

所以,我的理解是,在处理整数时,无论符号如何,我都应该使用int,除非我发现自己需要uint,当这种情况发生时,我就会知道(我想??)。

我的问题:

  • 这是正确的外卖吗
  • 如果是,为什么会出现这种情况
  • 什么时候应该使用uint?——可能是一个特定的例子;当进行二进制运算时";,因为我不知道这意味着什么:)

此外,我询问Go的具体实现。

这个答案是针对C的,但它在这里是相关的。

通常,如果使用整数,则应仅使用int类型。

这是推荐的一般,因为我们";一般为";相遇处理类型为CCD_ 2。通常也不需要您在使用intuint类型之间进行选择。

不要使用无符号类型来强制或建议数字必须为正。这不是他们的目的。

这是相当主观的。您可以很好地使用它来保护程序和数据类型的安全,并且不必为处理负整数情况下偶尔出现的错误而烦恼。

"这就是Go编程语言所推荐的,当你想进行逐位操作时,uints的具体例子很有用;

这看起来很模糊。请添加这个来源,我想读一下。

x := -5
y := uint(x)
fmt.Println(y)
>> 18446744073709551611

这是许多语言中的典型。这背后的逻辑是,当您将int类型转换为uint时,用于int的二进制表示被推到uint类型中。最后,一切都只是对二进制的抽象。例如,看看这个代码及其输出:

a := int64(-123)
byteSliceRev := *(*[8]byte)(unsafe.Pointer(&a))      // The byte slice representation we get is LTR in increasing order of significance
u := uint(a)
byteSliceRevU := *(*[8]byte)(unsafe.Pointer(&u))
byteSlice, byteSliceU := make([]byte, 8), make([]byte, 8)
for i := 0; i < 8; i++ {
byteSlice[i], byteSliceU[i] = byteSliceRev[7-i], byteSliceRevU[7-i]
}
fmt.Println(u)
// 18446744073709551493
fmt.Printf("%bn", byteSlice)
// [11111111 11111111 11111111 11111111 11111111 11111111 11111111 10000101]
fmt.Printf("%bn", byteSliceU)
// [11111111 11111111 11111111 11111111 11111111 11111111 11111111 10000101]

-5int64类型的字节表示与18446744073709551493中的uint类型相同。

所以,我的理解是,在处理整数时,无论符号如何,我都应该使用int,除非我发现自己需要uint,当这种情况发生时,我就会知道(我想??)。

但这不是或多或少适用于";我们";写

这是正确的结论吗?如果是,为什么会出现这种情况?

我希望我已经回答了这两个问题。如果你还有任何疑问,可以问我。

什么时候应该使用uint可能是一个特定的例子;当进行二进制运算时";,因为我不确定我知道这意味着什么:)

想象一个场景,在这个场景中,数据库中有一个表,其中有很多条目,其中id的整数总是正的。如果你将这些数据存储为int,那么每个条目的一位实际上是无用的,当你扩展它时,你会损失很多空间,而你本可以使用uint并保存它。在传输数据时也可以考虑类似的情况,准确地说,传输成吨的整数。此外,由于额外的位,uint的正整数范围是其对应的有符号整数的两倍,因此用完数字需要更长的时间。现在存储很便宜,所以人们通常忽略了这一所谓的小收益。

另一个用例是类型安全。uint永远不可能是负数,所以如果你的代码中有一部分对负数很敏感,那么它会非常方便。最好先得到错误,然后再在数据上浪费资源,发现它是不允许的,因为它是负面的。

Package Image使用uint和so crypto/tls,所以当您使用这些包时,您必须使用uint。

一开始我使用它是合乎逻辑的,但我不会为此争论,如果它成为一个问题,我会使用一种实用的方法。

比如为什么使用int作为len()

最新更新