Why in this code:
int a = 2, b = 0, c = 0;
c = -a; // resultado c = -2
c = ~b; // resultado c = -1
Why in the first case c=-2 and in the second c=-1 ?
Why in this code:
int a = 2, b = 0, c = 0;
c = -a; // resultado c = -2
c = ~b; // resultado c = -1
Why in the first case c=-2 and in the second c=-1 ?
1. Operator -
This operator is simple, you simply get the same value changed sign. If it is positive, it becomes negative; and if it is negative, it becomes positive.
So in your case -a where a=2 the result is -a=-2
2. Operator ~ called bitwise complement
This is more interesting. What this operator does is exchange the representation in binary of the number. That is, let's say the ~2 :
0000 0010
0 to 1 and all 1 to 0 ) the result is: 1111 1101 which is the representation in binary of -3 . ~2 = -3
Let's go to your specific case, which is ~0
0 that in binary is: 0000 0000
1111 1111 which is the representation in binary of -1 . ~0 = -1
You have more documentation from the operators here (for java).
To finish simply commenting how they say in this answer from SO original:
Why do I comment on this? To the naked eye the operator ~ is simply to change sign and subtract 1 . That is:
~x = -x - 1
I imagine that there was your question. But it depends on the computer the interpretation of the operator bits ~ is not always the same.
But as it says Paul Vargas in the chat :
Since the question is labeled with java there should be no results rare (that there are, for example, in c when work with
unsigned- see this link )
In the first assignment c = -a; you are using the "minus" symbol to deny the number contained in a so the value of c will be the negative of a : -2. It is the equivalent of multiplying by -1.
In the second case you are using the bit-level denial operator ~ also called "tilde". This operator inverts the 0s and 1s of the number. In this case the number is 0 and its representation in binary is 000000000. When applying the binary negation the resulting binary number is 11111111.
The binary number 11111111 represents the number -1 in decimal given that the representation "complement to 2" is used. To learn more about the add-on to 2 you can read the wikipedia entry
First of all we can start by reviewing what each of the operations is about:
The complement to 1 of a binary number is obtained by changing 0 → 1 and 1 → 0 . That is, each bit is changed by its complement. For example (using a byte ):
0 0 0 0 0 0 1 0 Original ( = 2 )
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
1 1 1 1 1 1 0 1 Complemento a 1 ( = -3 )
See Wikipedia on Complemento a uno .
The complement to 2 of a binary number is obtained by taking the complement to 1 of the number and then adding 1 to the least significant bit ( LSB or Least Significant Bit ). Taking the previous example:
0 0 0 0 0 0 1 0 Original ( = 2 )
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
1 1 1 1 1 1 0 1 Complemento a 1 ( = -3 )
+ 1
───────────────
1 1 1 1 1 1 1 0 Complemento a 2 ( = -2 )
The complement to 2 of 0 is 0 ( 00000000 → 11111111 → 00000000 ) and the complement 2 of the most negative number, Byte.MIN_VALUE , is the same ( 10000000 → 01111111 → 10000000 ).
See Wikipedia on Complemento a dos .
Now, analyzing the code:
c = -a; // resultado c = -2 If a = 2 (positive), then c = -a is calculated:
0000 0000 0000 0000 0000 0000 0000 0010 Original ( = 2 )
1111 1111 1111 1111 1111 1111 1111 1101 Complemento a 1 ( = -3 )
1111 1111 1111 1111 1111 1111 1111 1110 Sumando 1 al LSB ( = -2 )
Or the complement to 2.
See §15.15.4 within the The Java Language Specification . < br>
c = ~b; // resultado c = -1 If b = 0 (positive), then c = ~b is calculated:
0000 0000 0000 0000 0000 0000 0000 0000 Original ( = 0 )
1111 1111 1111 1111 1111 1111 1111 1111 Complemento a 1 ( = -1 )
See §15.15.5 within the The Java Language Specification .