Беззнаковое короткое назначение без подписи - PullRequest
0 голосов
/ 04 марта 2010

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

#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
}

Ответы [ 2 ]

5 голосов
/ 04 марта 2010

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

0 голосов
/ 04 марта 2010

Есть ряд проблем с вашим кодом - вот исправленная версия, которая должна вести себя правильно.

#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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...