2014-09-15 3 views
3

Теперь я делаю переход от C на C++ 11, и я стараюсь больше узнать о кастинге. В конце этого вопроса вы видите небольшую программу, которая запросила номер в качестве ввода, а затем отображает его как число и как символ. Затем он передается символу, и после этого я возвращаю его в size_t.Кастинг от size_t до char и вокруг

Когда я даю 200 в качестве входных данных, первый cout печатает 200, а второй распечатывает отпечатки 18446744073709551560. Как мне сделать это для печати 200 снова? Использую ли я неправильный перевод? Я уже пробовал разные актеры как динамические и reintepret.

#include<iostream> 

using namespace std; 

int main(){ 
    size_t value; 

    cout << "Give a number between 32 and 255: "; 
    cin >> value; 

    cout << "unsigned value: " << value << ", as character: `" << static_cast<char>(value) << "\'\n"; 

    char ch = static_cast<char>(value); 
    cout << "unsigned value: " << static_cast<size_t>(ch) << ", as character: `" << ch << "\'\n"; 
} 
+0

Преобразование между 'size_t' и' char' совершенно законно, но я не могу придумать случай, когда вы действительно хотите сделать это в реальной жизни. –

+0

Правда, в реальной жизни не нужно (я думаю?). Тем не менее, я стараюсь лучше понять листинг и разные типы в C++ – Michiel

ответ

8

size_t беззнаковым, обычная char «s зарегистрированны Несс реализации.

Casting 200 к подписанных полукоксу будет давать отрицательный результат, как 200 больше, чем CHAR_MAX который является 127 для наиболее общей ситуации, 8-битовый символ. (Продвинутое примечание - это преобразование также является , определяемым реализацией, но для всех практических целей вы можете принять отрицательный результат, на самом деле обычно -56).

Литье , что отрицательное значение обратно в неподписанный (но более широкий) целочисленный тип даст довольно большое значение, потому что беззнаковая арифметика обертывается вокруг.

Вы можете привести значение к unsigned char первым (дающему ожидаемому небольшой положительного значения), затем отливать, что в более широком беззнаковом типе.

Большинство компиляторов имеют переключатель, который позволяет переключаться на равную char на unsigned, чтобы вы могли поэкспериментировать с этим. Когда вы приходите писать переносимый код, попробуйте написать код, который будет работать правильно в обоих случаях!

+0

Re. обновление: не имеет значения, есть ли дополнение 1, подпись и т. д. и т. д. Арифметика C++ работает с точки зрения значений. Похоже, вы были отвлечены некоторыми неправильными комментариями (которые теперь были удалены!) –

Смежные вопросы