Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What does ~0 do?


Does ~0 mean its flipping 000000000 to 1111111111?

printf("Check: %i", ~0);

The printf results to -1, which is why I am confused.
Does -1 essentially mean the same thing as 11111111111111111 bits?

like image 489
AustinT Avatar asked Nov 28 '22 11:11

AustinT


2 Answers

Does ~0 mean its flipping 000000000 to 1111111111?

Yes, it does.

Does -1 essentially mean the same thing as 11111111111111111 bits?

In 2s complement representation, it does.

like image 114
Sergey Kalinichenko Avatar answered Dec 04 '22 23:12

Sergey Kalinichenko


Does ~0 mean its flipping 000000000 to 1111111111?

Yes, that's what it means.

printf("Check: %i", ~0);

The printf results to -1, which is why I am confused.

That's because of 2's complement arithmetic, where we have conventionally accepted zero to be

000000000000

and subtracting one from it requires a "borrow" that requires a borrow, and so on, until you "roll" the entire register

111111111111

Logically, if you add "1" to that number, it will carry, and carry, and so on until it "rolls" in the opposite direction, yielding 000000000 again.

Does -1 essentially mean the same thing as 11111111111111111 bits?

Yes, as long as you are using 2's complement signed integers.

---- Edited, to include details from cincutar's now deleted post (I wish he didn't delete it) ---

To see the same memory formatted as a (unsigned) hexadecimal number, use the command

printf("Check: %x", ~0);

which will print the output

Check ffffffff

which is (for those who don't read hexadecimal well)

11111111111111111111111111111111
like image 42
Edwin Buck Avatar answered Dec 04 '22 22:12

Edwin Buck