Получение неправильного числа переменных типа Char - PullRequest
0 голосов
/ 08 января 2012

в приведенном ниже коде, когда я запускаю его, я получаю y=-124 и z=4294967172 Вы можете объяснить мне ??(проверено, что если x<128 нет проблем)

char x=132;
signed y=x;
unsigned z=x;
cout<<y<<endl;
cout<<z<<endl;

Ответы [ 3 ]

3 голосов
/ 08 января 2012

char является 8-битным, поэтому, когда вы пишете char x = 132, вы фактически делаете это:

x = 1000 0100

signed int и unsigned int оба 32-битные, и всякий раз, когда вы назначаетезначение переменной «меньшего размера» в значение «большего размера» используется системой расширение знака , т.е. копирует бит знака в каждый бит слева.Таким образом, значение становится следующим:

1111 1111 1111 1111 1111 1111 1000 0100

Если вы интерпретируете его как значение со знаком, оно равно -124, а как значение без знака - 4294967172.

Более того, если вы определите charкак unsigned в первой строке, вы всегда получите 132, так как расширение знака не выполняется для значений без знака.

2 голосов
/ 08 января 2012

char только 8-битные, что означает, что они могут содержать только 256 значений, включая 0. Вы используете символ со знаком, что означает, что половина значений зарезервирована для отрицательных чисел, что дает максимальное положительное значение 127.

1 голос
/ 08 января 2012

После первой строки x равен 10000100 (132 означает 10000100b), и это значение -124 в машине (см. здесь ).
После второй строки y равно -124.
А после 3-й строки z - 111 ... 1110000100b. На старших битах 1, потому что вы устанавливаете отрицательное число, но когда вы печатаете, компилятор печатает его двоичное значение, потому что z без знака.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...