2010-03-04 3 views
-4

При назначении от long до short LSB 2 байта равно 0, где, поскольку MSB заполняется значениями из значений алгоритма func1() из стека. Почему это происходит, почему компилятор пытается получить эти значения нежелательной почты в MSB 2 байта?Unsigned Short to Unsigned Длительное назначение

#include <stdio.h> 

unsigned short func1(void); // NB: function prototype ! 

int main(void) 

{ 

    unsigned long int L = 0; 

    unsigned short K = 0; 

    L = func1(); 

     printf("%lu", L); // prints junk values 

     K = L; 

     printf("%u", K); // prints 0 

    return 0; 
} 

unsigned short func1(void) 

{ 

     unsigned short i = 0; 

     // Algorithm Logic!!! 

     return i; // returns 0 
} 
+0

Вам не хватает некоторых типов возврата и прототипов. func1() возвращает int, а не short. –

+1

Вы скопировали и вставили фиксированный код, который я предоставил, но вы не сказали, относится ли это теперь к воспринимаемой проблеме? –

ответ

5

Спецификатор для unsigned long является lu. Это для unsigned short - hu. Вы вызываете UB, не используя соответствующие спецификаторы.

+0

Предполагая, что диапазон 'unsigned short' вписывается в' int' на платформе OP, '% d' отлично подходит для первого' printf', так как значение 'unsigned short' будет повышаться до' int', когда передан 'printf'. Однако второй 'printf' неверен. – AnT

+0

@ dirkgently: ??? В C-значении по умолчанию аргументы * всегда * применяются к переменным аргументам, как в этом случае с 'printf'. Фактически, рекламные объявления по умолчанию используются * только * для не объявленных параметров (вариационный или прототип). Вот почему они называются * default *. Когда параметры объявлены, преобразование не * по умолчанию *, а скорее конкретное. – AnT

+0

Да. Я пропустил 6.5.2.2 п. 7. – dirkgently

0

Существует ряд проблем с вашим кодом - вот фиксированная версия, которая должна вести себя корректно.

#include <stdio.h> 

unsigned short func1(void); // NB: function prototype ! 

int main(void) 
{ 
    unsigned long int L = 0; 
    unsigned short K = 0; 

    L = func1(); 
    printf("%lu", L); 
    K = L; 
    printf("%u", K); 

    return 0; 
} 

unsigned short func1(void) 
{ 
    unsigned short i = 0; 

    // Algorithm Logic!!! 

    return i; // returns 0 
} 
+0

Hi Paul, Даже с изменениями это не сработало. Я вижу, что MSB заполнен значениями нежелательной почты и LSB с 0. Является ли это проблемой компилятора? – Pradna

+1

Как вы это видите? какой результат производит точная выше программа в вашей системе - и какой компилятор вы используете? – nos

+0

@Pradna - код выше компилируется без предупреждения с помощью 'gcc -Wall' и генерирует ожидаемый результат (0 в обоих случаях). Какой компилятор и ОС вы используете? –

Смежные вопросы