Сдвиг битов с числом больше 30 - PullRequest
0 голосов
/ 09 августа 2011

Я запутался в операторах битового сдвига (в c #).

Можете ли вы пролить свет на то, почему значение «a» ниже возвращает «1» вместо «4294967296»:

ulong a = 1 << 32

Я использую 32-битную машину.Это причина, почему?т.е. если бы я запускал тот же самый точный код на 64-битной машине, было бы значение «a» равным 4294967296?Я сильно сомневаюсь, что 32-битная или 64-битная архитектура имеет какое-либо отношение к моему вопросу, но я все равно должен был задать вопрос.приведет к 32-битному (или большему) значению?

Пример того, чего я надеюсь достичь:

long a = 1 << 31; // I want the value 2147483648 not the value -2147483648
long b = 1 << 32; // I want the value 4294967296 not the value 1

1 Ответ

2 голосов
/ 09 августа 2011

1 обрабатывается как int, смещается влево, и весь результат (который является целым числом) затем присваивается вашему ulong a.

Попробуйте это:

    ulong a = 1 << 32;
    Console.WriteLine(a);
    a = (ulong)1 << 32;
    Console.WriteLine(a);

Вы получите правильный ответ, когда приведете константу 1 к ulong.

1

4294967296

...