2

我有以下代码:

#include <stdio.h>
#include <stdlib.h>

int main(){

int first = cdab3412;

int second = abcd1234;

int result1 = (second >> 16) | (first & 0xFFFF0000);
int result2 = (first << 16) | (second & 0x0000FFFF);

printf("Outputs: %x and %x.\n", result1, result2);

结果 2 按预期结果输出:34121234

但是,result1 输出 ffffabcd。如果我只是将其保留为 (first & 0xFFFF0000),它会正确输出 cdab0000。

为什么 result1 是 ffffabcd 而不是 cdababcd?

4

2 回答 2

5

它被称为符号扩展。将类型设置为unsigned int,它应该可以工作。

于 2013-09-17T21:22:42.383 回答
4

second是有符号整数。因此,当您将其向右移动时,最左边的位变为 1。

如果你使用unsigned int's你会得到你期望的结果。

有符号与无符号一直是混淆的根源,因此您需要谨慎行事。

于 2013-09-17T21:24:42.670 回答