Seiji Hirao
Seiji Hirao

Reputation: 311

Dart double "bitwise not" is giving different result (~~-1 != -1)

So I am running dart on DartPad And I tried running the following code:

import 'dart:math';

void main() {
  print(~0);
  print(~-1);
  print(~~-1);
}

Which resulted in the following outputs

4294967295
0
4294967295

As you can see inverting the bits from 0 results in the max number (I was expecting -1 as dart uses two's complement) and inverting from -1 results in 0, which creates the situation where inverting 2 times -1 does not give me -1.

Looks like it's ignoring the first bit when inverting 0, why is that?

Upvotes: 0

Views: 495

Answers (1)

lrn
lrn

Reputation: 71763

Dart compiled for the web (which includes DartPad) uses JavaScript numbers and number operations. One of the consequences of that is that bitwise operations (~, &, |, ^, <<, >> and >>> on int) only gives 32-bit results, because that's what the corresponding JavaScript operations do.

For historical reasons, Dart chooses to give unsigned 32-bit results, not two's complement numbers. So ~-1 is 0 and ~0 is the unsigned 0xFFFFFFFF, not -1.

In short, that's just how it is.

Upvotes: 3

Related Questions