Почему math.MaxInt64 выводится как int32? - PullRequest
0 голосов
/ 25 февраля 2020

Попытка кросс-компиляции для GOARCH 386:

package main

import (
    "fmt"
    "math"
)

func main() {
    i := math.MaxInt64
    fmt.Println(i)
}

build:

env GOARCH=386 go run main.go

output:

# command-line-arguments
./sample.go:9:4: constant 9223372036854775807 overflows int

Почему переменная i выводится как int32, а не int64? Это известная ошибка или спецификация go lang?

1 Ответ

3 голосов
/ 25 февраля 2020

math.MaxInt64 это определено примерно так:

const (
    MaxInt64  = 1<<63 - 1
)

С https://blog.golang.org/constants:

Понятие нетипизированного константы в Go означают, что все числовые константы, будь то целые числа, значения с плавающей запятой, комплексные или даже символьные значения, живут в неком объединенном пространстве. Когда мы приводим их в вычислительный мир переменных, присваиваний и операций, фактические типы имеют значение.

При переводе вашей компиляции в 32-битную архитектуру вы приводите go по умолчанию int тип для чисел с явным int32 - тогда как на большинстве современных процессоров int неявно является int64.


Кстати, если вы явно используете тип int64 (вместо типа int):

var i int64
i = math.MaxInt64

, в то время как это может "скомпилировать" для 32-битной архитектуры, оно будет не работать:

GOARCH=386 go build -o too_big && ./too_big

./too_big: Bad CPU type in executable
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...