La valutazione del compilatore è diversa per l’espressione costante e l’altra espressione

Perché sotto il codice non viene compilato?

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) } 

Ottengo un errore

main.go: 12: costante 2147483648 overflow int

L’affermazione sopra è corretta. Sì, 2147483648 overflow int (nell’architettura a 32 bit). Ma l’operazione di spostamento dovrebbe comportare un valore negativo, ovvero -2147483648.

Ma funziona lo stesso codice, se cambio le costanti in variabili e ottengo l’output atteso.

 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) }