как подписанные 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 2

1 ответ:

Cdecl, по-видимому, является неполной спецификацией двоичного интерфейса приложения. Я ожидаю, что он полагается на двоичный интерфейс приложения System V для полноты. Я не могу найти явного утверждения этого.

Со страницы 43 приложения System V Binary Interface: Intel386 Architecture Processor addition , "функции передают все целочисленные аргументы в виде слов, расширяя или дополняя подписанные или неподписанные байты и полуслова по мере необходимости."

Это неопределенно, поскольку он не указывает, следует ли расширять аргументы расширением знака, заполнением нуля или иным способом. Я бы интерпретировал это как означающее, что содержимое добавленных битов не определено, поэтому вызывающие могут передавать любые значения, а вызываемые не должны использовать дополнительные биты.

Обратите внимание, что приведение выражений в вызовах функций C не будет иметь никакого влияния на то, как передаются аргументы. Типы передаваемых аргументов определяются объявлением функции. Я интерпретировал пример кода Вы приводится как псевдокод для концепций передачи различных размеров целых чисел, а не как фактический код C.