天天看點

go語言入門-常量補充整型最大值最小值go語言入門-常量補充整型最大值最小值

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)