Отличается ли оценка компилятора для константного выражения и другого выражения

Почему приведенный ниже код не компилируется?

package main

import (
    "fmt"
    "unsafe"
)

var x int = 1

const (
    ONE     int = 1
    MIN_INT int = ONE << (unsafe.Sizeof(x)*8 - 1)
)

func main() {
    fmt.Println(MIN_INT)

}

Я получаю ошибку

main.go: 12: константы 2147483648 переполняются int

Выше заявление является правильным. Да, 2147483648 переполняет int (в 32-битной архитектуре). Но операция сдвига должна привести к отрицательному значению, то есть -2147483648.

Но тот же код работает, если я изменяю константы на переменные и получаю ожидаемый результат.

package main

import (
    "fmt"
    "unsafe"
)

var x int = 1

var (
    ONE     int = 1
    MIN_INT int = ONE << (unsafe.Sizeof(x)*8 - 1)
)

func main() {
    fmt.Println(MIN_INT)

}

Ответы на вопрос(1)

Ваш ответ на вопрос