studio - superponer graficas en r
¿Por qué el valor absoluto del entero negativo máximo-2147483648 sigue siendo-2147483648? (5)
Como 2147483648 es mayor que INT_MAX
en su implementación, entonces abs(-2147483648)
no está definido.
El resultado de los abdominales (-2147483648) es -2147483648, ¿no es así? Parece inaceptable.
printf("abs(-2147483648): %d/n", abs(-2147483648));
salida:
abs(-2147483648): -2147483648
Este es el código en abs.c en el código fuente glibc de GNU.
/* Return the absolute value of I. */
int
DEFUN(abs, (i), int i)
{
return(i < 0 ? -i : i);
}
Entonces, abs (-2147483648) devuelve - (- 2147483648). En x86, es implementado por estas dos instrucciones.
movl $-2147483648, %eax
negl %eax
La instrucción negl se implementa de esta manera: num = 0-num; sbb se implementa de esta manera: resta la fuente del destino y resta 1 extra si se establece el indicador de acarreo. Entonces, abs (-2147483648) (el hex es 0x80000000) -> - (- 2147483648) -> 0 - (- 2147483648) se convierte en (0x80000000) finalmente.
detalles de la instrucción de negligencia, visite http://zsmith.co/intel_n.html#neg
detalles de la instrucción sbb, visite http://web.itu.edu.tr/kesgin/mul06/intel/instr/sbb.html
La norma dice acerca de abs()
:
Las funciones
abs
,labs
yllabs
calculan el valor absoluto de un enteroj
. Si el resultado no se puede representar, el comportamiento no está definido.
Y, de hecho, el resultado no se puede representar porque la representación complementaria de 2 de enteros con signo no es simétrica. Piénselo ... Si tiene 32 bits en un int
, eso le da 2 32 valores distintos de INT_MIN
a INT_MAX
. Eso es un número par de valores. Entonces, si solo hay un 0, el número de valores mayor que 0 no puede ser igual al número de valores menor que 0. Y, por lo tanto, no hay una contraparte positiva de INT_MIN
con un valor de - INT_MIN
.
Entonces, lo que es inaceptable es llamar a abs(INT_MIN)
en su plataforma.
Los números negativos se representan generalmente con complemento binario.
Para convertir positivo a negativo se utiliza la lógica.
x -> not(x)+1
Para aritmética de 8 bits.
01111111b es 127 y -127 se convierte en
10000000b + 1 = 10000001b
y en dirección opuesta se convierte en -127 10000001b.
01111110b + 1 = 01111111b
¿Qué hay de -128?
-128 es 10000000b y no tiene una contrapartida positiva, porque no hay 128 en aritmética con signo de 8 bits.
10000000 -> 01111111 + 1 = 10000000 y -128 de nuevo
Lo mismo se aplica a la pregunta original
Prueba esto
printf("abs(-2147483648): %u/n", abs(-2147483648));