varias superponer studio modificar lineas graficos graficas ejes c libc

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 y llabs calculan el valor absoluto de un entero j . 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));