Tóm tắt nhanh:
import "math/bits"
const (
MaxUint uint = (1 << bits.UintSize) - 1
MaxInt int = (1 << bits.UintSize) / 2 - 1
MinInt int = (1 << bits.UintSize) / -2
)
Lý lịch:
Như tôi đoán bạn đã biết, các uint
loại có kích thước tương tự như một trong hai uint32
hoặc uint64
, tùy thuộc vào nền tảng mà bạn đang ở trên. Thông thường, người ta sẽ chỉ sử dụng phiên bản chưa được thống nhất trong số này khi không có rủi ro đến gần giá trị tối đa, vì phiên bản không có thông số kích thước có thể sử dụng loại "gốc", tùy thuộc vào nền tảng, có xu hướng nhanh hơn.
Lưu ý rằng nó có xu hướng "nhanh hơn" bởi vì sử dụng loại không phải bản địa đôi khi yêu cầu kiểm tra giới hạn và toán học bổ sung được thực hiện bởi bộ xử lý, để mô phỏng số nguyên lớn hơn hoặc nhỏ hơn. Với ý nghĩ đó, hãy lưu ý rằng hiệu suất của bộ xử lý (hoặc mã được tối ưu hóa của trình biên dịch) hầu như sẽ luôn tốt hơn so với việc thêm mã kiểm tra giới hạn của riêng bạn, vì vậy nếu có bất kỳ rủi ro nào xảy ra, nó có thể gây ra ý nghĩa đơn giản là sử dụng phiên bản kích thước cố định và để cho phần mô phỏng được tối ưu hóa xử lý bất kỳ bụi phóng xạ nào từ đó.
Với điều đó đã được nói, vẫn còn một số tình huống hữu ích để biết những gì bạn đang làm việc với.
Gói " math / bits " chứa kích thước uint
, tính bằng bit. Để xác định giá trị tối đa, hãy dịch chuyển 1
theo nhiều bit đó, trừ đi 1. tức là:(1 << bits.UintSize) - 1
Lưu ý rằng khi tính giá trị tối đa uint
, thông thường bạn sẽ cần đặt nó một cách rõ ràng vào một biến uint
(hoặc lớn hơn), nếu không trình biên dịch có thể thất bại, vì nó sẽ mặc định cố gắng gán phép tính đó vào một ký hiệu int
(trong đó, như nên rõ ràng, nó sẽ không phù hợp), vì vậy:
const MaxUint uint = (1 << bits.UintSize) - 1
Đó là câu trả lời trực tiếp cho câu hỏi của bạn, nhưng cũng có một vài tính toán liên quan mà bạn có thể quan tâm.
Theo thông số kỹ thuật , uint
và int
luôn có cùng kích thước.
uint
32 hoặc 64 bit
int
cùng kích thước với uint
Vì vậy, chúng ta cũng có thể sử dụng hằng số này để xác định giá trị tối đa của int
, bằng cách lấy cùng một câu trả lời và chia cho 2
sau đó trừ đi 1
. I E:(1 << bits.UintSize) / 2 - 1
Và giá trị tối thiểu của int
, bằng cách dịch chuyển 1
theo nhiều bit đó và chia kết quả cho -2
. I E:(1 << bits.UintSize) / -2
Tóm tắt:
Tối đa: (1 << bits.UintSize) - 1
Tối đa: (1 << bits.UintSize) / 2 - 1
Tối thiểu: (1 << bits.UintSize) / -2
ví dụ đầy đủ (nên giống như dưới đây)
package main
import "fmt"
import "math"
import "math/bits"
func main() {
var mi32 int64 = math.MinInt32
var mi64 int64 = math.MinInt64
var i32 uint64 = math.MaxInt32
var ui32 uint64 = math.MaxUint32
var i64 uint64 = math.MaxInt64
var ui64 uint64 = math.MaxUint64
var ui uint64 = (1 << bits.UintSize) - 1
var i uint64 = (1 << bits.UintSize) / 2 - 1
var mi int64 = (1 << bits.UintSize) / -2
fmt.Printf(" MinInt32: %d\n", mi32)
fmt.Printf(" MaxInt32: %d\n", i32)
fmt.Printf("MaxUint32: %d\n", ui32)
fmt.Printf(" MinInt64: %d\n", mi64)
fmt.Printf(" MaxInt64: %d\n", i64)
fmt.Printf("MaxUint64: %d\n", ui64)
fmt.Printf(" MaxUint: %d\n", ui)
fmt.Printf(" MinInt: %d\n", mi)
fmt.Printf(" MaxInt: %d\n", i)
}
int(^uint(0) >> 1) // largest int
trích này được trích xuất từ golang.org/doc/effective_go.html#printing