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)