Здравствуйте, McSeem2, Вы писали:
MS>Мне надо вычислить значение выравнивания. То есть, есть массив байт и есть некий указатель внутри него, который может быть невыровненным, иметь, скажем, абстрактное значение 13. Допустим, мне надо выровнять его до 16 всегда в сторону увеличения. В данном случае — прибавить 3. Я делаю это так:
MS>MS>unsigned align = (alignment - unsigned(ptr) % alignment) % alignment;
MS>
MS>Где alignment=16 в данном случае.
MS>Вопрос в том, как преобразовать ptr к unsigned без предупреждений компилятора "for the possible 64-bit pointer to 32-bit unsigned conversion", причем надо сделать это без применения __int64 и прочих компиляторо-зависимых типов. Ясно, что если указатель 64 бита, а unsigned — 32, то и фиг с ней со старшей частью, на вычисление выравнивания она никак не влияет.
ну и возьми младшие биты:
unsigned *u_ptr = (unsigned *)&ptr;
unsigned align = (alignment - *u_ptr % alignment) % alignment;