Какие типы преобразований явно избыточны в соответствии со стандартом? - PullRequest
3 голосов
/ 07 августа 2010

Меня смущают правила, касающиеся этого вопроса [хороший URL-адрес может сэкономить время при ответе]. Я заметил, что большая часть времени неявно работает, но в других случаях это требуется.

например. Я ожидал, что это сработает:

long long a;
int b;
[..]
a = b * 1000;

но оказывается, переполняется 'a' и требуется

a = (long long) b * 1000;

Это было странно, так как «а» - «большой», я ожидал, что это будет беспокоить.

В любом случае, кроме этого примера, знаете ли вы исчерпывающий источник информации по этому вопросу? Нет, «в большинстве случаев все в порядке», это сводит меня с ума.

РЕДАКТИРОВАТЬ: это только вопрос «вторая часть выполняет вычисления в первую очередь и там они переполняются, следуйте этому правилу внимательно»?

РЕДАКТИРОВАТЬ 2: Если есть вычисления, такие как

long long a;
int b;
short c;
[..]
c = b + a * 3;

, будет делать

c = b + (int) a * 3; 

обеспечить правильное преобразование?

или понадобится

c = (short) b + (int) a * 3; 

или, будет ли достаточно

c = (short) b + a * 3; 

1 Ответ

6 голосов
/ 07 августа 2010

Тип преобразования работает шаг за шагом.Ваше выражение можно просмотреть как

a = (b * 1000);

в b * 1000, компилятор (допустим, он глупый) не знает, что вы собираетесь сохранить его в long long.Поскольку значения b и 1000 равны int с, результат также будет int.Размер a здесь не имеет значения.

Вы можете избежать броска, сделав 1000 a long long.

a = b * 1000LL;

Редактировать: Для редактирования 2:

  • a является long long, b является int, 3 является int.
  • Следовательно, a * 3 является long long
  • Следовательно, b + a*3 - это long long
  • Но приведение не требуется в c = b+a*3, поскольку арифметические операнды неявно преобразуются друг в друга.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...