int64(math.Pow(2, 63) - 1) 结果为 -922337203685477580

我正在尝试存储不同位的最大和最小有符号整数。该代码适用于 int64 以外的整数


package main


import (

    "fmt"

    "math"

)


func main() {

    var minInt8 int8 = -128

    var maxInt8 int8 = 127

    fmt.Println("int8\t->", minInt8, "to", maxInt8)

    fmt.Println("int8\t->", math.MinInt8, "to", math.MaxInt8)


    var minInt16 int16 = int16(math.Pow(-2, 15))

    var maxInt16 int16 = int16(math.Pow(2, 15) - 1)

    fmt.Println("int16\t->", minInt16, "to", maxInt16)

    fmt.Println("int16\t->", math.MinInt16, "to", math.MaxInt16)


    var minInt32 int32 = int32(math.Pow(-2, 31))

    var maxInt32 int32 = int32(math.Pow(2, 31) - 1)

    fmt.Println("int32\t->", minInt32, "to", maxInt32)

    fmt.Println("int32\t->", math.MinInt32, "to", math.MaxInt32)


    var minInt64 int64 = int64(math.Pow(-2, 63))

    var maxInt64 int64 = int64(math.Pow(2, 63) - 1) // gives me the wrong output

    fmt.Println("int64\t->", minInt64, "to", maxInt64)

    fmt.Println("int64\t->", math.MinInt64, "to", math.MaxInt64)

}


输出:


int8    -> -128 to 127

int8    -> -128 to 127

int16   -> -32768 to 32767

int16   -> -32768 to 32767

int32   -> -2147483648 to 2147483647

int32   -> -2147483648 to 2147483647

int64   -> -9223372036854775808 to -9223372036854775808

int64   -> -9223372036854775808 to 9223372036854775807

我不知道这种行为的原因,我们将不胜感激。


不负相思意
浏览 213回答 1
1回答

噜噜哒

这里有多个问题:math.Pow返回一个float64。此类型不能用于表示此处尝试计算所需的具有全精度的 64 位带符号整数。引用自双精度浮点格式整数值的精度限制从 −2^53 到 2^53(−9,007,199,254,740,992 到 9,007,199,254,740,992)的整数可以精确表示2^53 和 2^54 之间的整数 = 18,014,398,509,481,984 四舍五入到 2 的倍数(偶数)2^54 和 2^55 之间的整数 = 36,028,797,018,963,968 舍入为 4 的倍数即使精度足够(在 2^63 的特殊情况下也是如此),float64 的精度也不足以从 2^63 中减去 1。只需尝试以下操作(这里使用 uint64,因为 signed int64 是不够的):uint64(math.Pow(2, 63))    // -> 9223372036854775808 uint64(math.Pow(2, 63)-1)  // -> 9223372036854775808先将值转换为 uint64 然后再减去,但这只是因为 2^63 可以在 float64 中用完整的预定义表示,即使具有此大小的其他值不能:uint64(math.Pow(2, 63))-1  // -> 9223372036854775807
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go