Flags: - z si resultado = 0 - v si el signo del resultado no coincide cuando los operandos tienen mismo signo - c si la suma sin signo acarrea int suma(short num1, short num2) { // primero se calcula la suma en complemento a dos y se almacena el resultado // con mayor cantidad de bits. int res = num1 + num2; // cálculo del overflow: se compara que el número resultado esté entre el mayor // y el menor número representable en 16 bits. char v = 0; int minNum16Bits = -(1 << 15); // 1000 0000 0000 0000 (-32768, -2^15) int maxNum16Bits = (1 << 15) - 1; // 0111 1111 1111 1111 (32767, 2^15 - 1) if (res < minNum16Bits || res > maxNum16Bits) { v = 1; } char z = res == 0 ? 1 : 0; // para calcular el carry se repite la suma pero con operandos unsigned. // De esta forma, los números se interpretan como positivos y por tanto // la suma en 32 bits (int sumau) siempre tiene ceros a la izquierda. // El bit #16, por tanto, indica el acarreo. unsigned short num1u = num1; unsigned short num2u = num2; unsigned int sumau = num1u + num2u; char c = (sumau & 0x10000) >> 16; // finalmente se arma la palabra con la siguiente lógica: // 0000000z // | 0000000v // | 0000000c // | rrrrrrrrrrrrrr ------------------------ ----> rrrrrrrrrrrrrrcvz return (res & 0xFFFF) << 3 | c << 2 | v << 1 | z; }