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,labsyllabscalculan 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));