Литье int до char с использованием стилей стиля С++
В традиционном C вы можете сделать:
int i = 48;
char c = (char)i;
//Now c holds the value of 48.
//(Of course if i > 255 then c will not hold the same value as i).
Какой из методов каста С++ (static_cast, reinterpret_cast) подходит для выполнения этой работы?
Ответы
Ответ 1
Вы можете неявно преобразовывать числовые типы, даже если это теряет точность:
char c = i;
Однако вам может потребоваться включить предупреждения компилятора, чтобы избежать потенциально убыточных преобразований, подобных этому. Если вы это сделаете, используйте static_cast
для преобразования.
Другие роли:
-
dynamic_cast
работает только для указателей или ссылок на типы полиморфных классов;
-
const_cast
не может изменять типы, только const
или volatile
квалификаторы;
-
reinterpret_cast
предназначен для особых обстоятельств, преобразования между указателями или ссылками и полностью несвязанных типов. В частности, он не будет делать числовые преобразования.
- Стили стиля C и стиля в стиле функции выполняют любую комбинацию
static_cast
, const_cast
и reinterpret_cast
, чтобы выполнить задание.
Ответ 2
Вы должны использовать static_cast<char>(i)
для преобразования целого числа i
в char
.
reinterpret_cast
почти никогда не будет использоваться, если вы не хотите использовать один тип в принципиально другом типе.
Также reinterpret_cast
зависит от машины, поэтому его безопасное использование требует полного понимания типов, а также того, как компилятор реализует листинг.
Для получения дополнительной информации о листинге С++ см.:
Ответ 3
reinterpret_cast
не может использоваться для этого преобразования, код не будет компилироваться. Согласно стандарту С++ 03 5.2.10-1:
Conversions that can be performed explicitly using reinterpret_cast are listed below. No other conversion can be performed explicitly using reinterpret_cast.
Это преобразование не указано в этом разделе. Даже это неверно:
long l = reinterpret_cast<long>(i)
static_cast
- это тот, который должен использоваться здесь. См. this и this SO.
Ответ 4
Использование статического акта, вероятно, приведет к чему-то вроде этого:
// This does not prevent a possible type overflow
const char char_max = -1;
int i = 48;
char c = (i & char_max);
Чтобы предотвратить возможное переполнение типов, вы можете сделать это:
const char char_max = (char)(((unsigned char) char(-1)) / 2);
int i = 128;
char c = (i & char_max); // Would always result in positive signed values.
Если reinterpret_cast, вероятно, просто преобразуется непосредственно в char без какой-либо защиты от броска.
- > Никогда не используйте reinterpret_cast, если вы также можете использовать static_cast.
Если вы выполняете листинг между классами, static_cast также гарантирует, что эти два типа сопоставляются (объект является производной типа литья).
Если ваш объект является полиморфным, и вы не знаете, какой он есть, вы должны использовать dynamic_cast, который будет выполнять проверку типа во время выполнения и вернуть nullptr, если типы не совпадают.
ЕСЛИ вам нужен const_cast, вы, скорее всего, сделали что-то не так, и должны подумать о возможных альтернативах для исправления корректности const в вашем коде.