2013-12-09 8 views
2

Напримеркак подписываются голец и короткий передается в качестве параметра в конвенции 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 

Или как ОК (мы рассматриваем высокие биты как грязные)?

Я могу сделать некоторый эксперимент над специальным компилятором. Но я не уверен, что все это одно и то же подробно. Мне просто нужно какое-то официальное обещание.

+0

Какая разница в деталях реализации компилятора? Вы не должны ничего делать с этими высокими битами, просто считайте их неопределенными. – DCoder

+2

@DCoder: Это важно, если вы пишете на других языках, которые должны взаимодействовать с подпрограммами C или если вы пишете реализацию C, которая должна взаимодействовать с другими реализациями C. –

+0

Вы говорите, что, если прототипом функции является 'int foo (short x) '?, Вы думаете, что число, большее, чем' short', переводится в стек? Почему это так? – Floris

ответ

2

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

От странице 43 System V Application Binary Interface: Intel386 Architecture Processor Supplement, «Функции передать все целочисленные аргументы, как слова, расширение или обивка знаком или без знака байта и полуслова, как это необходимо.»

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

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

+0

Да, я думаю, у меня есть то, что я хотел.В моем примере действительно есть некоторые проблемы. Параметр может быть сброшен до короткого числа перед передачей. Я буду обновлять его. Спасибо. – HarryLeong