go語言入門-常量補充整型最大值最小值
引言
go 語言中沒有整型最大值最小值常量,檢視java源碼看以看出是常量值是寫死在代碼中,如下
@Native public static final int MIN_VALUE = 0x80000000;
/**
* A constant holding the maximum value an {@code int} can
* have, 2<sup>31</sup>-1.
*/
@Native public static final int MAX_VALUE = 0x7fffffff;
手工定義
go語言中并未提供相關常量定義,可以使用位操作自行定義常量内容。如下:
package main
package main
import "fmt"
const (
//Byte
BYTE_MAX_VALUE = ^byte(0) // 0xFF 2^8-1
BYTE_MIN_VALUE = byte(0) // 0x00 0
//int8
INT8_MAX_VALUE = int8(^uint8(0) >> 1) // 0x7F 2^7-1
INT8_MIN_VALUE = int8(^INT8_MAX_VALUE) // 0x80 -2^7
//uint8
UINT8_MAX_VALUE = ^uint8(0) // 0xFF 2^8-1
UINI8_MIN_VALUE = uint8(0) // 0x00 0
//int16
INT16_MAX_VALUE = int16(^uint16(0) >> 1) // 0x7FFF 2^15-1
INT16_MIN_VALUE = int16(^INT16_MAX_VALUE) // 0x8000 -2^15
//uint16
UINT16_MAX_VALUE = ^uint16(0) // 0xFFFF 2^16-1
UINI16_MIN_VALUE = uint16(0) // 0x0000 0
//int32
INT32_MAX_VALUE = int32(^uint32(0) >> 1) // 0x7FFFFFFF 2^31-1
INT32_MIN_VALUE = int32(^INT32_MAX_VALUE) // 0x80000000 -2^31
//uint32
UINT32_MAX_VALUE = ^uint32(0) // 0xFFFFFFFF 2^32-1
UINI32_MIN_VALUE = uint32(0) // 0x00000000 0
//int64
INT64_MAX_VALUE = int64(^uint64(0) >> 1) // 0x7FFFFFFFFFFFFFFF 2^63-1
INT64_MIN_VALUE = int64(^INT64_MAX_VALUE) // 0x8000000000000000 -2^63
//uint64
UINT64_MAX_VALUE = ^uint64(0) //0xFFFFFFFFFFFFFFFF 2^64-1
UINT64_MIN_VALUE = uint64(0) //0x0000000000000000 0
//int
INT_MAX_VALUE = int(^uint(0) >> 1) //取決于OS位數
INT_MIN_VALUE = int(^INT_MAX_VALUE) //取決于OS位數
//uint
UINT_MAX_VALUE = ^uint(0) //取決于OS位數
UINT_MIN_VALUE = uint(0) //取決于OS位數
)
func main() {
fmt.Println(BYTE_MAX_VALUE, BYTE_MIN_VALUE)
fmt.Println(INT8_MAX_VALUE, INT8_MIN_VALUE)
fmt.Println(UINT8_MAX_VALUE, UINI8_MIN_VALUE)
fmt.Println(INT16_MAX_VALUE, INT16_MIN_VALUE)
fmt.Println(UINT16_MAX_VALUE, UINI16_MIN_VALUE)
fmt.Println(INT32_MAX_VALUE, INT32_MIN_VALUE)
fmt.Println(UINT32_MAX_VALUE, UINI32_MIN_VALUE)
fmt.Println(INT64_MAX_VALUE, INT64_MIN_VALUE)
fmt.Println(UINT64_MAX_VALUE, UINT64_MIN_VALUE)
fmt.Println(INT_MAX_VALUE, INT_MIN_VALUE)
fmt.Println(UINT_MAX_VALUE, UINT_MIN_VALUE)
}
/**
output(筆者64系統):
255 0
127 -128
255 0
32767 -32768
65535 0
2147483647 -2147483648
4294967295 0
9223372036854775807 -9223372036854775808
18446744073709551615 0
9223372036854775807 -9223372036854775808
18446744073709551615 0
*/
示例講解
以int8為例,可以看出int8是有符号整型,占用1個BYTE,8個bit位,是以最大值的二進制為:0111 1111 ,16進制表示為0x7F。我們可以通過int8(0)進行構造,0的二進制為0000 0000,取反後為1111 1111,1111 1111和0111 1111高位不同其餘一樣,是以可以把1111 1111右移一位變為0111 1111,用代碼表示則為:int8(^uint8(0) >> 1)