Это код в abs.c в исходном коде GNU glibc.
/* Return the absolute value of I. */
int
DEFUN(abs, (i), int i)
{
return(i < 0 ? -i : i);
}
Таким образом, abs (-2147483648) возвращение - (- 2147483648). В x86, это реализовать с помощью этой инструкции два
movl $-2147483648, %eax
negl %eax
инструкция negl реализуется таким путем: Num = 0-Num; sbb реализуется следующим образом: Вычитает источник из пункта назначения и вычитает 1 дополнительный, если установлен флаг переноса. Таким образом, abs (-2147483648) (hex - 0x80000000) -> - (- 2147483648) -> 0 - (- 2147483648) становится (0x80000000) окончательно.
детали инструкции negl, пожалуйста визит http://zsmith.co/intel_n.html#neg
детали инструкции SBB, пожалуйста, посетите http://web.itu.edu.tr/kesgin/mul06/intel/instr/sbb.html
Я считаю, что это неопределенное поведение. У меня нет стандартного C, поэтому я не могу его поддержать. –
Что вы ожидаете от этого, учитывая, что 'abs (int)' возвращает 'int'? –
Последний проект C11 говорит (7.21.6.1, about abs и friends) «Если результат не может быть представлен, поведение не определено» –