Dillydill123 - 1 month ago 10x
C++ Question

Why does masking a negative number produce a positive number?

in c++, I have the following code:

``````int x = -3;
x &= 0xffff;
cout << x;
``````

This produces

``````65533
``````

But if I remove the negative, so I have this:

``````int x = 3;
x &= 0xffff;
cout << x;
``````

I simply get
`3`
as a result

Why does the first result not produce a negative number? I would expect that -3 would be sign extended to 16 bits, which should still give a twos complement negative number, considering all those extended bits would be 1. Consequently the most significant bit would be 1 too.

It looks like your system uses 32-bit `int`s with two's complement representation of negatives.

Constant `0xFFFF` covers the least significant two bytes, with the upper two bytes are zero.

The value of `-3` is `0xFFFFFFFD`, so masking it with `0x0000FFFF` you get `0x0000FFFD`, or `65533` in decimal.

Positive `3` is `0x00000003`, so masking with `0x0000FFFF` gives you `3` back.

You would get the result that you expect if you specify 16-bit data type, e.g.

``````int16_t x = -3;
x &= 0xffff;
cout << x;
``````