смещение вправо bool в C ++ - PullRequest
0 голосов
/ 07 октября 2019

В данном коде bool был передан foo, как показано в mainFunc. Я не уверен, что e >> 24 - правильная вещь в foo. Я верю, что это даст только значения мусора.

void foo(bool e){
   int a;
   bool s;
   e = e >> 24;
   ...
}

void mainFunc(){
   int *arg = (int*)malloc(sizeof(int));
   *arg = xxxx;   

   foo(*(bool*)arg);
}

Это правильно?

РЕДАКТИРОВАТЬ: я был больше обеспокоен операцией e >> 24, так как е это bool. не приведет ли это к какой-либо проблеме? Извиняюсь за недоразумение.

Ответы [ 2 ]

1 голос
/ 07 октября 2019

Меня больше беспокоит операция e >> 24, поскольку e равно bool. не приведет ли это к какой-либо проблеме?

Встроенные арифметические операторы не работают с типами, меньшими int, подробнее см. встроенное повышение . В выражении e = e >> 24; e равно bool, и чтобы сдвинуть его вправо, компилятор сначала увеличивает значение от e до int, выполняет сдвиг и затем преобразует результат обратно в bool. Результат всегда равен int 0, который преобразуется в bool false. Если только sizeof(int) <= 3, в этом случае его сдвиг на 24 бита или более является неопределенным поведением.

0 голосов
/ 07 октября 2019

Приведение к bool просто создает новое логическое значение для передачи foo. Ничего не происходит ни с одним из четырех байтов, на которые указывает arg. Они остаются точно такими же.

...