Как этот код будет работать на машине с прямым порядком байтов? - PullRequest
5 голосов
/ 01 сентября 2011

Если у меня есть код:

uint64_t a = 0x1111222233334444;
uint32_t b = 0;
b = a;
printf("a is %llx ",a);
printf("b is %x ",b);

и вывод:

 a is 1111222233334444 b is 33334444

Вопросы :

  1. Будет ли поведение на машине с прямым порядком байтов таким же?

  2. Если я присваиваю значение a в b или произвожу типизацию, будет ли результат таким же в старшем порядке?

Ответы [ 3 ]

9 голосов
/ 01 сентября 2011

Код у вас там будет работать так же.Это связано с тем, что поведение downcasting определяется стандартом C.

Однако, если вы сделали это:

uint64_t a = 0x0123456789abcdefull;
uint32_t b = *(uint32_t*)&a;
printf("b is %x",b)

Тогда оно будет зависеть от порядка байтов.

РЕДАКТИРОВАТЬ:

Little Endian: b равно 89abcdef

Big Endian: b равно 01234567

1 голос
/ 01 сентября 2011

При назначении переменных компилятор обрабатывает все за вас, поэтому результат будет таким же для big-endian.

При типизации указателей на память результат НЕ будет таким же для big-endian.

0 голосов
/ 01 сентября 2011
Прямое назначение

приведет к одинаковому результату как с прямым, так и с прямым порядком байтов.

Тип памяти на машине с прямым порядком байтов будет выводить

a равно 1111222233334444 b равно 11112222

...