Литье 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 в вашем коде.