Побитовое И между 8-битным целым и 32-битным целым числом в C ++ - PullRequest
2 голосов
/ 08 декабря 2011

Если я выполню побитовое И между 8-битным целым (int8_t) и 32-битным целым (int), результатом будет 8-битное или 32-битное целое число?

Я использую GNU / Linux и компилятор GCC

Чтобы поставить вопрос несколько иначе, перед выполнением побитового И отбрасываются ли первые 24 бита 32-разрядного целого числа, или 8-разрядное целое число первого типа приведено к 32-разрядному целому числу?

РЕДАКТИРОВАТЬ: В этом небольшом коде

#include <iostream>
#include <stdint.h>
int main()
{
  int    i=34;
  int8_t j=2;

  std::cout<<sizeof((i&j))<<std::endl;//Bitwise and between a 32 bit integer and 8 bit integer
  return 0;
}

Я получаю вывод как 4. Я предполагаю, что это означает, что тогда результат будет 32-разрядным целым числом. Но я не знаю, зависит ли результат от машины, компилятора или ОС.

Ответы [ 4 ]

6 голосов
/ 08 декабря 2011

Для оператора & (и большинства других операторов) любые операнды, меньшие int, будут преобразованы в int до оценки операции.

Из стандарта C99 (6.5.10 - описание побитового оператора AND):

Обычные арифметические преобразования выполняются над операндами.

(6.3.1.8 - описание обычных арифметических преобразований):

целочисленные преобразования выполняются для обоих операндов

(6.3.1.1 - описание целочисленных повышений):

Если int может представлять все значения исходного типа, значение преобразуется в int; в противном случае он преобразуется в unsigned int. Это называется целое число акции.

2 голосов
/ 08 декабря 2011

Независимо от того, что определяет язык, ответ на вопрос заключается в том, что не имеет значения, будут ли старшие 24 бита отброшены перед битовой обработкой и выполнены, так как они представляют собой все нулевые биты в одном операнде и, следовательно, врезультат.

1 голос
/ 08 декабря 2011

8-битное целое число приведено к 32-битному целому числу.Побитовые операторы запускают обычные арифметические преобразования (что означает, что меньший тип повышается, чтобы соответствовать большему).Это определено в главе 5.1 спецификации.

0 голосов
/ 08 декабря 2011

Целочисленные типы, меньшие чем int, переводятся в int, прежде чем над ними будет выполнена какая-либо операция.Возможно, вы захотите взглянуть на то, что CERT Secure Coding Standard говорит о «понимании правил целочисленного преобразования».

...