Soy un novato en Golang, en realidad, soy nuevo en la programación basada en tipos. Solo tengo conocimiento de JS.

Mientras revisa ejemplos simples en los tutoriales de Golang. ¿Encontré que agregar a1 + a2 proporciona un valor entero negativo?

var a1 int16 = 127
var a2 int16 = 32767

var rr int16 = a1 + a2

fmt.Println(rr)

Resultado:

-32642

Exceptuada:

  1. El compilador arrojará un error como excedido el int16 max.
  2. (O) GO convierte automáticamente la int16 a int32.
  3. 32,894

¿Pueden explicar por qué muestra -32642?

go
-3
Sathish 5 may. 2018 a las 17:38

3 respuestas

La mejor respuesta

Este es el resultado de Integer Overflow comportándose como se define en la especificación.

No ves los resultados esperados, porque

  1. El desbordamiento ocurre en tiempo de ejecución, no en tiempo de compilación.
  2. Go está estáticamente escrito.
  3. 32,894 es mayor que el valor máximo representable por un int16.
5
JimB 5 may. 2018 a las 14:50

Es muy simple. El entero de 16 bits asigna la parte positiva I 0 - 32767 (0x0000, 0x7FFF) y la parte negativa de 0x8000 (−32768) a 0xFFFF (-1).

Por ejemplo 0 - 1 = -1 y se almacena como 0xFFFF.

Ahora en su caso específico: 32767 + 127.

Se desborda porque 32767 es el valor máximo para un entero de 16 bits con signo, pero si fuerza la suma 0x7FFF + 7F = 807E y convierte 807E en 16 bits con signo entero obtienes -32642.

Puede comprenderlo mejor aquí: Representaciones de números firmados

4
Robert 5 may. 2018 a las 15:22

Además, verifique estas Constantes matemáticas:

const (
    MaxInt8   = 1<<7 - 1
    MinInt8   = -1 << 7
    MaxInt16  = 1<<15 - 1
    MinInt16  = -1 << 15
    MaxInt32  = 1<<31 - 1
    MinInt32  = -1 << 31
    MaxInt64  = 1<<63 - 1
    MinInt64  = -1 << 63
    MaxUint8  = 1<<8 - 1
    MaxUint16 = 1<<16 - 1
    MaxUint32 = 1<<32 - 1
    MaxUint64 = 1<<64 - 1
)

Y verifique la versión humana de estos valores aquí

0
Miguel Pragier 5 may. 2018 a las 15:58