LINUX.ORG.RU

printf ( «%x\n», -15 );


0

0

В программе на си есть команды:

char I=-15;
printf ( «%x\n», I );

Я ожидал, что printf выведет на экран «f1», вместо этого получил «fffffff1».

Это ошибка, или так и предусмотрено стандартом си?

Сколько реально байт занимает переменная I: 1 или 4?

Что сделать, чтобы 1- и 2-байтные переменные выводились в шестнадцатеричном виде в виде 2- и 4-значных чисел соответственно?

Заранее спасибо.

★★★★★
Ответ на: комментарий от ntp

>При передаче в printf происходит расширение до int
чисто по секрету, расширение происходит не только при передачи в prinf

xydo ★★
()
Ответ на: комментарий от xydo

> расширение происходит не только при передачи в prinf

А где ещё? В любой функции, где параметры передаются через стек? Или и через регистры тоже? И когда GCC передаёт параметры через регистры? Только для внутренних функций?

question4 ★★★★★
() автор топика
Ответ на: комментарий от xydo

Чисто по секрету: стоит по ссылке пройти и почитать врезки.

ntp
()
Ответ на: комментарий от question4

> В смысле? И как в этом отношении различаются 32- и 64-разрядные системы?

Если брать amd64 & x86 - то у них разные ABI. В amd64 большинство (пока отведённые регистры не кончатся) параметров передаются в регистрах. А в x86 - на стеке.

P.S. не нужно писать про -mregparm, это не стандартный ABI

anonymous
()
Ответ на: комментарий от anonymous

Спасибо.

-mregparm

И за это спасибо. Может, пригодится.

question4 ★★★★★
() автор топика
Ответ на: комментарий от question4

В википедии всё разжёвано просто до неприличия, вплоть до примера у ТС.

LamerOk ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.