В Руководстве Beej по сетевому программированию есть функция это должно было обеспечить переносимый способ сериализации 16-битного целого числа.
/*
** packi16() -- store a 16-bit int into a char buffer (like htons())
*/
void packi16(unsigned char *buf, unsigned int i)
{
*buf++ = i>>8; *buf++ = i;
}
Я не понимаю, почему оператор *buf++ = i;
является переносимым, поскольку присвоение целого числа без знака (i
) беззнаковому символу (*buf
) приведет к сужающему преобразованию.
- Гарантирует ли стандарт С++, что при таком преобразовании
unsigned int
всегда усекается, а его младшие 8 битов сохраняются вunsigned char
? Если нет, есть ли предпочтительный способ решить проблему? Достаточно ли изменить тело функции на следующее?
*buf++ = (i>>8) & 0xFFFFU; *buf++ = i & 0xFFFFU;
unsigned int
теперь редко бывает 16-битным. Кроме этого, в назначении будет использоваться число, которое соответствует типу назначения и конгруэнтно по модулю 2ⁿ, где n — количество битов в типе назначения. - person chris   schedule 07.09.2014