Ошибка в преобразовании char в long - PullRequest
1 голос
/ 07 сентября 2011
long int FinalValue;
char a,b,c,d;

a=0x1;
b=0x2;
c=0x3;
d=0x4;

FinalValue |=  (long)a;
FinalValue <<= 0x8;
FinalValue |=  (long)b;
FinalValue <<= 0x8;
FinalValue |=  (long)c;
FinalValue <<= 0x8;
FinalValue |=  (long)d;


Printf("%d, %d, %d, %d", a,b,c,d);
Printf("FinalValue = %ld"FinalValue);

Выход получен: 1 2 3 4 FinalValue = 0x05020304

Ожидаемый результат: 1 2 3 4 FinalValue = 0x01020304

Когда приведенный выше код выполняется с разными входами (для a, b, c, d), выходной результат, полученный в MSB с конечным значением, составляет: 0x (a | d) bcd (в вышеприведенном примере 0x1 или с 0x4 для получения 0x5)

Почему байт MSB получает ORed с байтом LSB?

1 Ответ

5 голосов
/ 07 сентября 2011
  1. Сначала инициализируйте FinalValue до 0, неинициализированные локальные (автоматические) переменные содержат мусор.

  2. изменить Printf("FinalValue = %ld"FinalValue); на printf("FinalValue = %ld", FinalValue);, добавить запятую.

  3. Что такое Printf? Вы, вероятно, имели в виду printf.

  4. Вы хотите выводить в шестнадцатеричном формате? Используйте %lx. printf("FinalValue = %lx", FinalValue);

  5. Сделайте FinalValue без знака и затем сдвиньте. Сдвиг подписанного бита подписанного числа зависит от реализации.

ОБНОВЛЕНИЕ : добавлена ​​точка 5

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