สรุปด่วน:
import "math/bits"
const (
MaxUint uint = (1 << bits.UintSize) - 1
MaxInt int = (1 << bits.UintSize) / 2 - 1
MinInt int = (1 << bits.UintSize) / -2
)
พื้นหลัง:
อย่างที่ฉันเข้าใจคุณจะรู้ว่าuint
ประเภทนั้นมีขนาดเท่ากันuint32
หรือuint64
ขึ้นอยู่กับแพลตฟอร์มที่คุณใช้งาน โดยปกติแล้วจะใช้รุ่นที่ไม่มีการแก้ไขของสิ่งเหล่านี้เฉพาะเมื่อไม่มีความเสี่ยงที่จะเข้าใกล้ค่าสูงสุดเนื่องจากรุ่นที่ไม่มีข้อกำหนดขนาดสามารถใช้ประเภท "ดั้งเดิม" ขึ้นอยู่กับแพลตฟอร์มซึ่งมีแนวโน้มที่จะเร็วกว่า
โปรดทราบว่ามันมีแนวโน้มที่จะ "เร็วขึ้น" เนื่องจากการใช้ชนิดที่ไม่ใช่เจ้าของภาษาบางครั้งต้องใช้การตรวจสอบทางคณิตศาสตร์และขอบเขตเพิ่มเติมเพื่อดำเนินการโดยโปรเซสเซอร์เพื่อเลียนแบบจำนวนเต็มที่ใหญ่กว่าหรือเล็กกว่า โปรดทราบว่าประสิทธิภาพของโปรเซสเซอร์ (หรือโค้ดที่ปรับปรุงแล้วของคอมไพเลอร์) นั้นจะดีกว่าการเพิ่มรหัสตรวจสอบขอบเขตของคุณเองดังนั้นหากมีความเสี่ยงที่จะเกิดขึ้น ใช้เพียงเวอร์ชันขนาดคงที่และปล่อยให้อีมูเลชั่นที่ดีที่สุดจัดการกับ fallout ใด ๆ
เมื่อพูดถึงเรื่องนี้แล้วก็ยังมีบางสถานการณ์ที่มีประโยชน์ที่จะรู้ว่าคุณกำลังทำงานอะไรอยู่
แพ็คเกจ " math / bits " ประกอบด้วยขนาดของuint
หน่วยเป็นบิต ในการกำหนดค่าสูงสุดให้เลื่อน1
โดยบิตจำนวนมากลบ 1 เช่น:(1 << bits.UintSize) - 1
ทราบว่าเมื่อคำนวณมูลค่าสูงสุดของuint
คุณจะต้องโดยทั่วไปที่จะนำมันอย่างชัดเจนเป็นuint
(หรือใหญ่) ตัวแปรมิฉะนั้นคอมไพเลอร์อาจล้มเหลวที่จะเริ่มต้นกับความพยายามที่จะกำหนดคำนวณที่เป็นลงนามint
(ที่เป็นควร ชัดเจนว่าจะไม่เหมาะสม) ดังนั้น:
const MaxUint uint = (1 << bits.UintSize) - 1
นั่นเป็นคำตอบที่ตรงกับคำถามของคุณ แต่มีการคำนวณที่เกี่ยวข้องสองสามข้อที่คุณอาจสนใจ
ตามที่สเป็ค , uint
และint
มักจะมีขนาดเดียวกัน
uint
ทั้ง 32 หรือ 64 บิต
int
ขนาดเดียวกับ uint
ดังนั้นเราจึงยังคงสามารถใช้นี้เพื่อกำหนดค่าสูงสุดint
โดยการว่าคำตอบที่เหมือนกันและหารด้วยแล้วลบ2
1
เช่น:(1 << bits.UintSize) / 2 - 1
และมูลค่าขั้นต่ำของการint
โดยขยับจากที่บิตจำนวนมากและแบ่งผลโดย1
-2
เช่น:(1 << bits.UintSize) / -2
สรุป:
MaxUint: (1 << bits.UintSize) - 1
MAXINT: (1 << bits.UintSize) / 2 - 1
minint: (1 << bits.UintSize) / -2
ตัวอย่างแบบเต็ม (ควรเป็นเหมือนด้านล่าง)
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
ดึงมาจากgolang.org/doc/effective_go.html#printing