Desafio Go
Detectando overflow em int8
Enunciado
Escreva uma função somaSegura(a, b int8) (int8, bool) que soma dois int8 e retorna o resultado e um booleano indicando se houve overflow. No main, teste com (100, 50) e (10, 20) e imprima overflow ou o valor. Use conversão explícita para int para detectar o estouro.
Requisitos
- A função deve ter assinatura
somaSegura(a, b int8) (int8, bool). - Detectar overflow comparando com os limites de
int8(-128 a 127). - Imprimir
overflowquando o booleano fortrue. - Testar os pares
(100, 50)e(10, 20).
Código inicial
package main
import "fmt"
func somaSegura(a, b int8) (int8, bool) {
// implemente
return 0, false
}
func main() {
// teste os pares
}
Saída esperada
100 + 50 = overflow
10 + 20 = 30
Ver dica
Converta a e b para int antes de somar; o int é largo o bastante para não estourar. Depois compare com 127 e -128.
Mostrar solução
package main
import "fmt"
// somaSegura soma dois int8 e informa se houve overflow.
func somaSegura(a, b int8) (int8, bool) {
soma := int(a) + int(b) // converte para int (mais largo) antes de somar
if soma > 127 || soma < -128 {
return 0, true // overflow detectado
}
return int8(soma), false // conversão de volta é segura
}
func main() {
pares := [][2]int8{{100, 50}, {10, 20}}
for _, p := range pares {
r, overflow := somaSegura(p[0], p[1])
if overflow {
fmt.Printf("%d + %d = overflow\n", p[0], p[1])
} else {
fmt.Printf("%d + %d = %d\n", p[0], p[1], r)
}
}
}
Passo a passo
somaSegurarecebe doisint8e retorna(int8, bool), seguindo o padrão de Go de devolver o valor junto com um indicador de sucesso.- Convertemos
aebparaintcomint(a)eint(b):inté largo o suficiente para representar a soma sem estourar. - Comparamos
somacom os limites deint8:127(máximo) e-128(mínimo). - Se estourou, retornamos
0, true; o valor0é ignorado pelo chamador. - Caso contrário, convertemos de volta com
int8(soma)— seguro, pois já validamos o intervalo. - No
main, iteramos sobre um slice de pares e imprimimos conforme o booleano.
Por que funciona
O overflow em Go é silencioso: int8(127) + int8(1) resulta em -128 sem erro. Ao promover para int, a soma fica no intervalo correto e podemos comparar com os limites de int8. Só depois de validar fazemos a conversão de volta. Esse padrão — promover, validar, reconverter — é comum ao trabalhar com tipos menores.
Erros comuns
- Somar direto como
int8:a + bcom(100, 50)retorna-106sem aviso, e a função nunca detecta overflow. - Comparar com
math.MaxInt8sem importarmath: erroundefined: math. Nesse caso, use os literais127e-128. - Esquecer de converter de volta: retornar
intonde a assinatura pedeint8gera erro de compilaçãocannot use soma (variable of type int) as int8 value.
Outra forma de resolver
Usar math.MaxInt8 e math.MinInt8 para deixar os limites explícitos:
import "math"
if soma > math.MaxInt8 || soma < math.MinInt8 { ... }
É preferível quando você quer evitar números mágicos e deixar claro qual tipo está sendo validado.
Saída esperada
100 + 50 = overflow
10 + 20 = 30