# coding: utf-8
# Verifica se, em uma soma ou subtracao de numeros inteiros com sinal, ocorre Overflow

# Define a mensagem a ser retornada, caso ocorra Overflow.
def Mensagem(numero):
	
	if len(numero) == 2:
		return "Representacao com 2 bits: -2 a 1."	
	if len(numero) == 3:
		return "Representacao com 3 bits: -4 a 3."
	elif len(numero) == 4:
		return "Representacao com 4 bits: -8 a 7."
	elif len(numero) == 5:
		return "Representacao com 5 bits: -16 a 15."
	elif len(numero) == 6:
		return "Representacao com 6 bits: -32 a 31."
	elif len(numero) == 7:
		return "Representacao com 7 bits: -64 a 63."
	elif len(numero) == 8:
		return "Representacao com 8 bits: -128 a 127."
	elif len(numero) == 9:
		return "Representacao com 9 bits: -256 a 255."
	elif len(numero) == 10:
		return "Representacao com 10 bits: -512 a 511."
	else:
		return "Nao é possivel representar este numero em %d bits." % len(numero)

# Atribui a mesma quantidade de bits aos numeros.
def igualaNumeros(numero1, numero2):

    if len(numero1) > len(numero2):

        acrecimo = len(numero1) - len(numero2)

        for i in range(acrecimo):

            numero2 = "0" + numero2

    elif len(numero1) < len(numero2):

        acrecimo = len(numero2) - len(numero1)

        for i in range(acrecimo):

            numero1 = "0" + numero1

    

    return numero1, numero2

# Transforma um numero inteiro em binario.
def transformaBinario(num):
	if num != 0:
		num = abs(num)
		lista = []
		numero = ""
		while (num >= 1):
		
			bit = num % 2
			
			num = num / 2
			
			lista.append(bit)
		lista.reverse()
		for i in lista:
			numero += str(i)
		return numero
	else:
		return "0"
	

# Aplica o complemento de 2, caso o numero seja negativo.
def complemento2(numeronegativo):

	antesdoprimeiro1 = []
	complemento = ""
	for i in range(len(numeronegativo)-1,-1,-1):
	
		antesdoprimeiro1.append(numeronegativo[i])
		
		if numeronegativo[i] == "1":
			for j in range(len(numeronegativo) - len(antesdoprimeiro1)):
			
				if numeronegativo[j] == "0":
					complemento +="1"
			
				if numeronegativo[j] == "1":
					complemento += "0"
				
			break
					
	antes = ""	

	antesdoprimeiro1.reverse()
	for d in antesdoprimeiro1:
		antes += d
	return complemento + antes
		
# Verifica se ocorreu Overflow.
def verificaOverflow (numero1, numero2):

    vaiUm = 0

    listaVaiUm = []

    for i in range(len(numero1) - 1, -1, -1):

        if int(numero1[i]) + int(numero2[i]) + vaiUm > 1:

            vaiUm = 1

        else:

            vaiUm = 0

        listaVaiUm.append(vaiUm)
        
    if listaVaiUm[len(listaVaiUm) - 1] != listaVaiUm[len(listaVaiUm) - 2]:
        return True

    else:
        return False



num1= int(raw_input("Digite o primeiro numero: "))

num2 = int(raw_input("Digite o primeiro numero: "))

numero1 = transformaBinario(num1)
numero2 = transformaBinario(num2)



if len(numero1) != len(numero2):
	numero1 = igualaNumeros(numero1, numero2)[0]
	numero2 = igualaNumeros(numero1, numero2)[1]


if num1 < 0:
	numero1 = complemento2("0" + numero1)
	
else:
	numero1 = "0" + numero1

if num2 < 0:
	numero2 = complemento2("0" + numero2)
	
else:
	numero2 = "0" + numero2
	
print "\nPrimeiro numero: %s" % numero1
print "Segundo numero: %s" % numero2
print "Soma: %i" % (num1 + num2)

if verificaOverflow(numero1, numero2):
	print "\nOcorreu overflow."
	print Mensagem(numero1)
else:
	print "Nao ocorreu overflow."


