Отличается ли оценка компилятора для константного выражения и другого выражения
Почему приведенный ниже код не компилируется?
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)
}