Unsigned return type returns signed number C

Unsigned return type returns signed number C

我目前正在学习 K&R C,我通过这个例子进入了按位运算符部分:

unsigned getbits(unsigned x, int p, int n) {
  return (x >> (p + 1 - n)) & ~(~0 << n);
}

我一直在玩弄它,我做了以下事情:

unsigned getbits(unsigned x, int p, int n) {
   return (~0 << n);
}

我输入了n = 2,得到的结果是-4。如果我没记错的话,位形式的结果应该是这样的(对于 32 位整数): 1111 1111 1111 1100
如果函数的 return 类型不是无符号的,我可以看出 -4 的来源,但是因为 return 类型是无符号的,这不应该是 return 一个无符号数?为什么是 returning -4?

谢谢!

即使函数声明它是 returning unsigned,return 之后的值的实际使用决定了它的解释方式。

例如,printf("%d", x);x 解释为 signed int,即使它被声明为其他任何东西。