Когда мы приведем unsigned int
к unsigned long
в C (для этого примера мы можем предположить, что целые без знака имеют длину 32 бита, а длинные без знака - 64 бита), будет ли выражение, использующее полученное значение, правильновыровнен с 8-байтовой границей?
unsigned int i = 8;
if ((unsigned long)i == 8) // <--- is (unsigned long)i aligned properly?
{
// do something
}
Если изначально i
выровнен с 4-байтовой границей, то при условии, что адрес приведенного значения не изменяется, (unsigned long) i
не обязательновыровнен по 8-байтовой границе, хотя его длина составляет 8 байт. С другой стороны, безопасно ли предположить, что компилятор выделит какое-то новое место в стеке (временное, может быть?) Для результата приведения и, таким образом, правильно выровняет его с некоторыми дополнительными затратами?