2 回答

TA貢獻2003條經驗 獲得超2個贊
此答案適用于 C,但與此處相關。
通常,如果您使用整數,則應該只使用該
int
類型。
通常建議這樣做,因為我們“通?!庇龅降拇蠖鄶荡a都處理 type int
。您通常也不需要在使用 anint
和uint
type 之間進行選擇。
不要使用無符號類型來強制或建議數字必須為正數。那不是他們的目的。
這是相當主觀的。您可以很好地使用它來保持您的程序和數據類型安全,并且不必為處理由于負整數情況而出現的偶然錯誤而煩惱。
“這是 Go 編程語言所推薦的,當你想要進行按位運算時,uint 的具體示例很有用”
這看起來很模糊。請為此添加來源,我想閱讀它。
x := -5
y := uint(x)
fmt.Println(y)
>> 18446744073709551611
這是許多語言的典型特征。這背后的邏輯是,當您將int類型轉換為 auint時,用于 的二進制表示會被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("%b\n", byteSlice)
// [11111111 11111111 11111111 11111111 11111111 11111111 11111111 10000101]
fmt.Printf("%b\n", byteSliceU)
// [11111111 11111111 11111111 11111111 11111111 11111111 11111111 10000101]
-5int64類型的字節表示與18446744073709551493類型相同。uint
所以,我的理解是,在處理整數時,我應該始終使用 int,而不管符號如何,除非我發現自己需要 uint,并且在這種情況下我會知道(我認為???)。
但這對于“我們”編寫的每一個代碼來說不是或多或少都是真的嗎?!
這是正確的外賣嗎?如果是這樣,為什么會這樣?
我希望我已經回答了這兩個問題。如果您仍有任何疑問,請隨時問我。
什么時候應該使用 uint 的例子是什么?- 也許是一個具體的例子,而不是“進行二進制操作時”,因為我不確定我知道這意味著什么:)
想象一個場景,您的數據庫中有一個表,其中有很多條目,其中 an 的整數id始終為正數。如果您將此數據存儲為int每個條目的一個位實際上是無用的,并且當您擴展它時,當您可以使用uint并保存它時,您將失去很多空間。在傳輸數據時可以考慮類似的情況,準確地說是傳輸大量整數。此外,uint由于額外的位,與對應的有符號整數相比,正整數的范圍翻了一番,因此用完 numbers需要更長的時間。存儲現在很便宜,所以人們通常會忽略這個所謂的小收益。
另一個用例是類型安全。Auint永遠不會是負數,所以如果你的代碼的一部分對負數很敏感,它可以證明是非常方便的。最好在將資源浪費在數據上之前得到錯誤,以發現它是不允許的,因為它是負面的。

TA貢獻1772條經驗 獲得超5個贊
Package Image 使用 uint 和 crypto/tls,所以當你使用這些包時你必須使用 uint。
我一開始是合乎邏輯地使用它,但我不會為此而爭吵,如果它成為一個問題,我會使用一種實用的方法。
- 2 回答
- 0 關注
- 1197 瀏覽
添加回答
舉報