bitfields (unsigned long long --> signed int)
От: Tilir Россия http://tilir.livejournal.com
Дата: 09.10.14 12:55
Оценка: 46 (2)
Hi,

Обычный сишный код. Для bitfields явно указано что они unsigned. Разница только в выводе:

#include <stdio.h>

struct bitflds
{
  unsigned long long xxx: 21;
  unsigned long long addr: 27;
  unsigned long long yyy: 16;
};

int
main (void)
{
  struct bitflds mess;
  mess.addr = 0x54aull;

  fprintf (stderr, "bad: 0x%llx\n", (unsigned long long ) (mess.addr << 21ull));
  fprintf (stderr, "good: 0x%llx\n", ((unsigned long long ) mess.addr) << 21ull);
  return 0;
}


На экране:

bad: 0xffffffffa9400000
good: 0xa9400000


Я долго не понимал wtf.

Чуть позже стандарте C99 я нашёл прекрасную, просто прекрасную фразу (3.1.1.2):

If an int can represent all values of the original type (as restricted by the width, for a bit-field), the value is converted to an int


То есть получается, что я там пишу unsigned ему по барабану, всё конвертнется в signed int и полетит вот таким колесом по кочкам?

Кто-нибудь может объяснить что это и зачем?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.