Я столкнулся с кодом, который выполняет следующее преобразование:
static_cast<unsigned long>(-1)
Насколько я могу судить, стандарт С++ определяет, что происходит при преобразовании знакового целочисленного значения в неподписанный тип интеграла (см. Что произойдет, если я присвою отрицательное значение неподписанная переменная?).
В вышеприведенном коде есть озабоченность тем, что типы источника и назначения могут быть разных размеров и зависит от того, влияет ли это на результат. Будет ли компилятор увеличивать тип исходного значения до кастинга? Вместо этого вместо этого будет применено целое число без знака того же размера, а затем увеличьте это? Или что-то еще?
Чтобы уточнить код,
int nInt = -1;
long nLong = -1; // assume sizeof(long) > sizeof(int)
unsigned long res1 = static_cast<unsigned long>(nInt)
unsigned long res2 = static_cast<unsigned long>(nLong);
assert(res1 == res2); // ???
В принципе, я должен беспокоиться о написании кода, например
static_cast<unsigned long>(-1L)
над
static_cast<unsigned long>(-1)