〜(char)((unsigned char)〜0 >> 1)到底会发生什么?

时间:2019-03-29 00:23:38

标签: c

我不完全了解这种一元运算符组合会发生什么。我知道,当您键入它时,它将最终产生最小的带符号char值,我不知道到底是怎么做到的。

我认为解决方案是 ================================================ =======================

〜是一元运算符,实际上与逻辑操作数“ NOT”含义相同吗?

那么,不是char意味着什么? char中的所有内容都减少为0?

是否将字符转换为未签名的字符?

然后我们将char强制转换为unsigned,但是所有非0的字符都将移到2 ^ 1,因为>> 1与执行2 ^ 1是相同的事情,对吧?

============================================= ==========================

#include <stdio.h>

int main(){
printf("signed char min = %d\n", ~(char)((unsigned char) ~0 >> 1)); 

return 0;
}

它产生最小的签名char,可以工作,但我只是想知道幕后发生的事情,因为尚不完全清楚。

2 个答案:

答案 0 :(得分:1)

这段代码看起来很熟悉,所以我搜索了我的古老邮件并找到了这个宏:

#define MSB(type) (~(((unsigned type)-1)>>1))

在Mark S. Brader的签名中。

它返回指定整数类型的值,除了最高有效位外,其他位全为零。

  • (unsigned char)-1产生#FF
  • (#FF)>>1产生#7F
  • ~(#7F)产生#80

碰巧的是,#80恰好是给定类型的最小负值(尽管从理论上讲,C不需要使用2s补码来存储负整数)。

编辑:

最初的MSB(type)旨在产生一个值,该值将分配给类型为“ type”的变量。

@chux指出,如果在其他情况下使用它,则可能会将多余的位向左扩展。

一个更正确的版本是:

#define MSB(type) ((unsigned type)~(((unsigned type)-1)>>1))

答案 1 :(得分:1)

~不是 logic NOT,而是 bitwise NOT,因此它独立翻转每一位。

~0都是1位,将其强制转换为无符号char并向右移动一次将使第一位为0。强制转换为有符号char并按位应用NOT将使第一位为1,其余为0,即two's complement整数的最小值(这假设此处使用二进制补码,但标准不保证)。

需要进行强制转换以确保该移位将用0填充第一位,因为在有符号整数上可能使用算术移位,该算术移位用数字的符号位(1 in这种情况)。