Выходное значение отличается от значения, полученного в качестве аргумента в функции при выполнении прямой операции - PullRequest
0 голосов
/ 29 сентября 2019

Я попытался сделать 11..10..0 (это двоичное число с последовательными 32-n нулями в маленьких цифрах).

// Can assume that 0 <= n <= 31

int masking(int n) {
  return (~0)<<(~n+33);
}

Однако, когда я вводил 0 во входном nЯ ожидал 0, но получил -1(0xffffffff).

Без использования ввода

  • (~0)<<(~0+33) дает 0.

  • (-1)<<32 также дает 0.

Я не знаю, почему я получил другие результаты.

1 Ответ

1 голос
/ 29 сентября 2019

Возможно, вы захотите использовать 64-битную математику.Согласно стандарту «C» результат сдвига переменной с N битами определяется только тогда, когда число сдвигов меньше размера переменной (0..N-1)

Выполнение сдвига включено(~ 0) (целое число, обычно 32-битное), приведет к неопределенному поведению для ~ n + 33 (n = 0), поскольку ~ n + 33 = 32, выше предела 31.

Изменение кодадля использования (~ 0L) выдает запрошенный результат маскировки (0) = 0

При условии, что вы работаете в универсальном Linux - gcc по умолчанию будет использовать 32-битное целое число, 64-битную длину и 64-битный указатель.

include <stdio.h>

int masking(int n) {
  return (~0UL)<<(~n+33);
}

void main(void)
{
        for (int i=0 ; i<4 ; i++) {
                printf("M(%d)=%x\n", i, masking(i)) ;
        }
}

Выход:

M(0)=0
M(1)=80000000
M(2)=c0000000
M(3)=e0000000
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...