在c ++中,我有以下代码:
int x = -3;
x &= 0xffff;
cout << x;
Run Code Online (Sandbox Code Playgroud)
这产生了
65533
Run Code Online (Sandbox Code Playgroud)
但如果我删除否定,所以我有这个:
int x = 3;
x &= 0xffff;
cout << x;
Run Code Online (Sandbox Code Playgroud)
我只是得到3了结果
为什么第一个结果不会产生负数?我期望-3将符号扩展到16位,这应该仍然给出二进制补码负数,考虑到所有这些扩展位都是1.因此最重要的位也是1.
看起来你的系统使用32位ints和负数的二进制补码表示.
常量0xFFFF覆盖最不重要的两个字节,高两个字节为零.
的价值-3是0xFFFFFFFD,让掩盖它与0x0000FFFF你0x0000FFFD,或65533十进制.
积极的3是0x00000003,所以掩盖与0x0000FFFF你3回来.
如果指定16位数据类型,您将得到预期的结果,例如
int16_t x = -3;
x &= 0xffff;
cout << x;
Run Code Online (Sandbox Code Playgroud)