将char转换为long时出错

hem*_*nth 1 c

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);
Run Code Online (Sandbox Code Playgroud)

获得的输出: 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字节与LSB字节进行OR运算?

pho*_*xis 5

  1. 首先初始化FinalValue0,未初始化的本地(自动)变量包含垃圾.

  2. 更改Printf("FinalValue = %ld"FinalValue);printf("FinalValue = %ld", FinalValue);,添加逗号.

  3. 什么是Printf?你可能意味着printf.

  4. 你想要以十六进制输出?使用%lx.printf("FinalValue = %lx", FinalValue);

  5. FinalValue无符号然后转移.有符号数的有符号位的移位取决于实现.

更新:添加第5点