Из стандарта С:
6.3.1.3 Целые числа со знаком и без знака
- Когда значение с целочисленным типом преобразуется в другое целое число
тип, отличный от _Bool, если значение может быть представлено новым
тип, это без изменений.
- В противном случае, если новый тип без знака, значение конвертируется
многократно добавляя или вычитая больше, чем максимальное значение, которое
может быть представлен в новом типе до
значение находится в диапазоне нового типа.
- В противном случае новый тип подписывается и значение не может быть
представлены в нем; результат
реализации.
Преобразование относится к случаю № 3, потому что значения подписаны. Таким образом, результат определяется реализацией.
Однако для кода:
#include <stdio.h>
int main()
{
unsigned long a = 0x27ea4d72UL;
unsigned char x = a;
printf("%x",x);
return 0;
}
Преобразование относится к случаю № 2, и в этом случае стандарт в основном говорит, что результат будет 0x27ea4d72% (UCHAR_MAX + 1). Где UCHAR_MAX равен 255 (наиболее распространенный случай), вы получите 0x72.