что происходит при приведении типа к другому типу данных - PullRequest
3 голосов
/ 16 декабря 2010

почему для этого кода вывод fffffffa, а не 0000000a

char c=0Xaa;
     int b=(int)c;
     b=b>>4;
     printf("%x",b);

то, что я думал, было char c = OXaa будет aa, а когда оно будет типизировано int, оно изменится на 000000aa.

Может ли кто-нибудь сказать мне, что происходит, когда тип char приводится в целое число ...

Ответы [ 3 ]

3 голосов
/ 16 декабря 2010

int подписано, так что апскейшн распространяется на знак.Рассмотрим двоичные представления.

0xAA = 10101010

char часто подписывается, поэтому при приведении к (подписано по умолчанию) int первое 1 означает, что оноинтерпретируется как отрицательное число с дополнением до двух:

((int) ((signed char)0xAA) ) = 11111111111111111111111110101010

Чтобы избежать этого, используйте unsigned char или unsigned int.

1 голос
/ 16 декабря 2010

Тип вашего компилятора char подписан, поэтому при преобразовании в int он расширяется до знака, так как установлен самый высокий бит.

Затем оператор правого смещения поддерживает отрицательность и смещает новые вверху. Сдвиг вправо отрицательного значения - неопределенная операция, поэтому не делайте этого.

0 голосов
/ 16 декабря 2010

Это зависит от используемой архитектуры (ЦП), а также от компилятора.

В вашем случае, я предполагаю, что значение переменной c помещается в регистр процессора, где только младшие 8биты определены.При приведении к int и копировании в другую переменную эти биты со значением «undefined» тоже копируются, и, поскольку они теперь являются частью целочисленного значения, обрабатываются как допустимые.

скопировать значение c следующим образом:

int b = (int)c & 0xff;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...