2017-04-20 72 views

回答

0

操作符〜C++中(以及类似的C和Java其他类似C语言)执行按位非操作 - 中的所有操作数的1位被设置为0,并且所有的0比特在操作数是设置为1.换句话说,它会创建原始数字的补码。欲了解更多信息,请参阅here

按位NOT运算符有一个有趣的属性,当用2的补码表示的数字应用 ,它改变了数字的 签收再减去一个(你可以在上面的例子中看到)。

如果你检查什么的〜 - 运算符不为y这样的:

#include <stdio.h> 

int main() 
{ 
    unsigned int x = -1; 
    printf("%i\n",x); // treat data as if singed integer 
    printf("%u\n",x); // treat data is if unsigned integer 

    int y = ~0; //type promotion from int to unsigned int 
    printf("%i\n",y); 
    if (x == y) 
     printf("same"); 
    else 
     printf("not same"); 
    return 0; 
} 

你可以看到:

成功时刻:0记忆:16064信号:0

-1 same

T ry出here

这是为什么?

为整数-1位表示为(见two's complement了解详细信息)

11111111 11111111 11111111 11111111 

如果在无符号整数读这

11111111 11111111 11111111 11111111 

是最大可能的无符号整型。由于环绕,无符号整数-1成为最大无符号整数。因此,无符号-1和int〜0是相同的。

相关问题