В чем разница между приведением long к int и использованием побитового И для получения 4 младших байтов?
Тип.Кастинг делает значение int
.And'ing не меняет тип.
Диапазон.В зависимости от диапазона int,long
приведение может вообще не изменять значение.
IDB и UB. определенное реализацией поведение и неопределенное поведение присутствуют со смешанным знаком.
Чтобы "получить" 4 LSBytes, используйте & 0xFFFFFFFFu
или приведите к uint32_t
.
Вопрос OP излишне запутан.
long n = 0x8899AABBCCDDEEFF;
-> Преобразование значения вне диапазона целочисленного типа со знаком является реализацией -определенный .
В противном случае новый тип подписывается и значение не может быть представлено в нем;либо результат определяется реализацией, либо генерируется определяемый реализацией сигнал.
C11 §6.3.1.3 3
printf("0x%016lX\n", n);
-> Печать long
с "%lX"
вне общего диапазона long/unsigned long
- неопределенное поведение .
Давайте продолжим с unsigned long
:
unsigned long n = 0x8899AABBCCDDEEFF; // no problem,
printf("0x%016lX\n", n); // no problem,
printf("0x%016X\n", (int)n); // problem, C11 6.3.1.3 3
printf("0x%016X\n", (unsigned int)n); // no problem,
printf("0x%016lX\n", n & 0xFFFFFFFF); // no problem,
«Нет проблем»все в порядке, даже если unsigned long
является 32-разрядным или 64-разрядным.Выход будет отличаться, но все в порядке.
Напомним, что int,long
не всегда 32,64 бит.(16,32), (32,32), (32,64) являются общими.
int
равно не менее 16 бит.
long
равно по крайней мере , что int
и по крайней мере 32 бит.