как подписанные char и short передаются как параметр в соглашении о вызовах cdecl
Например
int foo(short x);
short s = -1;
foo(s);
Это то же самое, что
//int foo(short x); //Updated
int foo(signed x);
short s = -1;
foo((signed)s);//sign-extend and push to stack
Или это то же самое, что
//int foo(short x); //Updated
int foo(unsigned)
short s = -1;
foo((unsigned)(unsigned short)s);//zero-extend and push to stack
Или и то и другое нормально(мы относимся к старшим битам как к грязным)?
Я могу провести некоторый эксперимент на специальном компиляторе.Но я не уверен, что все вещи одинаковы в мельчайших деталях.Мне просто нужно официальное обещание.
1 ответ:
Cdecl, по-видимому, является неполной спецификацией двоичного интерфейса приложения. Я ожидаю, что он полагается на двоичный интерфейс приложения System V для полноты. Я не могу найти явного утверждения этого.
Со страницы 43 приложения System V Binary Interface: Intel386 Architecture Processor addition , "функции передают все целочисленные аргументы в виде слов, расширяя или дополняя подписанные или неподписанные байты и полуслова по мере необходимости."
Это неопределенно, поскольку он не указывает, следует ли расширять аргументы расширением знака, заполнением нуля или иным способом. Я бы интерпретировал это как означающее, что содержимое добавленных битов не определено, поэтому вызывающие могут передавать любые значения, а вызываемые не должны использовать дополнительные биты.
Обратите внимание, что приведение выражений в вызовах функций C не будет иметь никакого влияния на то, как передаются аргументы. Типы передаваемых аргументов определяются объявлением функции. Я интерпретировал пример кода Вы приводится как псевдокод для концепций передачи различных размеров целых чисел, а не как фактический код C.