Операции между double и int [duplicate]

Тег Execute (Java Script) из innerHTML

Замените ваш скриптовый элемент div, имеющим класс class class = "javascript", и закройте его с помощью

Не выполняйте измените контент, который вы хотите выполнить (ранее он был в теге скрипта, и теперь он находится в теге div)

Добавьте стиль на свою страницу ...

Теперь запустите eval с помощью jquery (JQuery js должен быть уже включен)

   $('.javascript').each(function() {
      eval($(this).text());

    });`

В моем блоге вы можете узнать больше здесь .

129
задан Matt Montag 6 April 2011 в 08:44
поделиться

9 ответов

В C ++ операторы (для типов POD) всегда действуют на объекты того же типа. Таким образом, если они не совпадают, то они будут повышаться в соответствии с другими. Тип результата операции совпадает с типом операндов (после преобразования).

If either is      long          double the other is promoted to      long          double
If either is                    double the other is promoted to                    double
If either is                    float  the other is promoted to                    float
If either is long long unsigned int    the other is promoted to long long unsigned int
If either is long long          int    the other is promoted to long long          int
If either is long      unsigned int    the other is promoted to long      unsigned int
If either is long               int    the other is promoted to long               int
If either is           unsigned int    the other is promoted to           unsigned int
If either is                    int    the other is promoted to                    int
Both operands are promoted to int

Примечание. Минимальный размер операций - int. Таким образом, short / char продвигаются до int до выполнения операции.

Во всех ваших выражениях int до выполнения float до выполнения операции. Результатом операции является float.

int + float =>  float + float = float
int * float =>  float * float = float
float * int =>  float * float = float
int / float =>  float / float = float
float / int =>  float / float = float
int / int                     = int
int ^ float =>  <compiler error>
173
ответ дан Frank Seifert 17 August 2018 в 14:49
поделиться
  • 1
    «Минимальный размер операций - это int». - Это было бы очень странно (что относительно архитектур, которые эффективно поддерживают char / короткие операции?) Действительно ли это в спецификации C ++? – Rafał Dowgird 6 April 2011 в 08:59
  • 2
    Точнее: встроенные операторы всегда действуют на одни и те же типы. Пользовательские операторы могут смешивать произвольные типы, если хотя бы один операнд имеет определенный пользователем тип. – Drew Hall 6 April 2011 в 09:01
  • 3
    @Rafal: Да. Предполагается, что int является наиболее эффективным целым типом для работы на конкретной платформе. char всегда должен быть 1, но короткий может быть того же размера, что и int. – Martin York 6 April 2011 в 09:08
  • 4
    @ Tomalak Geret'kal: У вас достаточно репутации для редактирования вопроса. Но его технически не часть C ++, хотя каждый компилятор (кроме одного), который я использовал, предоставляет это расширение (как правило, это просто приятный отбор от C-компилятора). И я не упоминал C ++ 0x becuase (a) Я забыл и (б) его еще не официальный (но главным образом потому, что я забыл). – Martin York 6 April 2011 в 17:50
  • 5
    Пример проблемы & quot; int передается в unsigned int ": ((int) 4) - ((unsigned int) 5) приведет к 4294967295 для 32-битных int и 32-битных неподписанных int. – nitsas 24 April 2013 в 14:15

Тип выражения, когда обе части одного типа одного типа, будет преобразован в наибольший для обоих. Проблема заключается в том, чтобы понять, какой из них больше, чем другой (он не имеет ничего общего с размером в байтах).

В выражениях, в которых задействовано действительное число и целое число, целое число будет повышаться до реального числа. Например, в int + float тип выражения является float.

Другое отличие связано с возможностью типа. Например, выражение, включающее int и long int, будет иметь тип long int.

1
ответ дан Baltasarq 17 August 2018 в 14:49
поделиться
  • 1
    Это неправда. На возможных платформах long является "большим" чем a float, но каков тип long + float? – CB Bailey 6 April 2011 в 08:52
  • 2
    -1: Что вы подразумеваете под самым большим ? Является ли float больше чем int? Или наоборот ? – Paul R 6 April 2011 в 08:52
  • 3
    Спасибо за ваши Коментарии. Да, размер в байтах здесь вообще не представляет интереса. По мере того, как это выходит, очевидно, что выделение курсивом по курсу недостаточно для объяснения ответа. Во всяком случае, не имеет смысла объяснять это более глубоко, так как теперь есть другие, очень тщательные ответы. – Baltasarq 6 April 2011 в 12:24

Целая глава 4 рассказывает о конверсиях, но я думаю, вас в основном интересуют следующие:

4.5 Интегральные рекламные акции [conv.prom] rvalue типа char, подписанный char, unsigned char, short int , или unsigned short int может быть преобразован в rvalue типа int, если int может представлять все значения типа источника; В противном случае исходное значение rvalue может быть преобразовано в rvalue типа unsigned int. Rvalue типа wchar_t (3.9.1) или тип перечисления (7.2) может быть преобразован в rvalue первого из следующих типов, который может представлять все значения его базового типа: int, unsigned int, long или unsigned длинный. Rvalue для целочисленного битового поля (9.6) можно преобразовать в r значение типа int, если int может представлять все значения битового поля; в противном случае его можно преобразовать в unsigned int, если unsigned int может отображать все значения битового поля. Если бит-поле еще больше, к нему не применяется целая реклама. Если бит-поле имеет нумерованный тип, оно рассматривается как любое другое значение этого типа для целей продвижения по службе. Rvalue типа bool может быть преобразовано в rvalue типа int, при этом false становится равным нулю, а true становится единым. Эти преобразования называются интегральными акциями.

4.6 Продвижение по плавающей запятой [conv.fpprom] rvalue типа float может быть преобразовано в rvalue типа double. Значение не изменяется. Это преобразование называется продвижением с плавающей запятой.

Поэтому все преобразования, включающие float, - результат float.

Только тот, который включает оба int - результат: int: int / int = int

1
ответ дан BЈовић 17 August 2018 в 14:49
поделиться

Этот ответ во многом посвящен комментарию, сделанному @ RafałDowgird:

«Минимальный размер операций - это int». - Это было бы очень странно (что относительно архитектур, которые эффективно поддерживают char / короткие операции?) Действительно ли это в спецификации C ++?

Имейте в виду, что стандарт C ++ имеет важное значение правило «как-если». См. Раздел 1.8: Исполнение программы:

3) Это положение иногда называют правилом «как есть», поскольку реализация может игнорировать любое требование Стандарта, пока результат как если бы это требование выполнялось, насколько это можно определить из наблюдаемого поведения программы.

Компилятор не может установить int размером 8 бит, даже если он был самым быстрым, так как стандарт предусматривает 16-битный минимум int.

Поэтому, в случае теоретического компьютера с супербыстрого 8-битными операциями, неявное продвижение к int для арифметики может иметь значение. Однако для многих операций вы не можете определить, действительно ли компилятор выполнял операции с точностью int, а затем преобразовывался в char для хранения в вашей переменной или если операции выполнялись в символе все время.

Например, рассмотрим unsigned char = unsigned char + unsigned char + unsigned char, где добавление будет переполняться (допустим, значение 200 для каждого). Если вы повысились до int, вы получите 600, которые затем будут неявно сбрасываться в unsigned char, который будет обертывать по модулю 256, таким образом давая окончательный результат 88. Если вы не делали таких рекламных акций, вы бы необходимо обернуть между двумя первыми дополнениями, что уменьшит проблему с 200 + 200 + 200 до 144 + 200, что составляет 344, что уменьшится до 88. Другими словами, программа не знает разницы, поэтому компилятор свободен для игнорировать мандат на выполнение промежуточных операций в int, если операнды имеют более низкий рейтинг, чем int.

Это в целом относится к сложениям, вычитанию и умножению. Это не верно в общем случае для деления или модуля.

5
ответ дан David Stone 17 August 2018 в 14:49
поделиться

Решение к проблеме получило WA (неправильный ответ), затем я изменил один из int на long long int и дал AC (принять ) [/ д2]. Раньше я пытался сделать long long int += int * int, и после того, как исправил его до long long int += long long int * int. Googling я придумал,

1. Арифметические преобразования

Условия преобразования типов:

Условия Met ---> Конверсия

  • Любой операнд имеет тип длинный двойной. ---> Другой операнд преобразуется в тип long double.
  • Предыдущее условие не выполнено, и оба операнда имеют тип double. ---> Другой операнд преобразуется в тип double.
  • Предварительные условия не выполняются и оба операнда имеют тип float. ---> Другой операнд преобразуется в тип float.
  • Предварительные условия не выполняются (ни один из операндов не имеет типов с плавающей запятой). ---> Интегральные аксиомы выполняются в операндах следующим образом: Если любой из операндов имеет тип unsigned long, другой операнд преобразуется в тип unsigned long. Если предыдущее условие не выполнено, и если любой из операндов имеет тип long, а другой типа unsigned int, оба операнда преобразуются в тип unsigned long. Если предыдущие два условия не выполняются, и если один из операндов имеет тип long, то другой операнд преобразуется в тип long. Если предыдущие три условия не выполняются, и если один из операндов имеет тип unsigned int, другой операнд преобразуется в тип unsigned int. Если ни одно из предыдущих условий не выполняется, оба операнда преобразуются в тип int.

2. Целочисленные правила преобразования

  • Целочисленные акции:

Целочисленные типы, меньшие, чем int, продвигаются, когда на них выполняется операция. Если все значения исходного типа могут быть представлены как int, значение меньшего типа преобразуется в int; в противном случае он преобразуется в unsigned int. Целочисленные акции применяются как часть обычных арифметических преобразований к некоторым выражениям аргументов; операнды унарных +, - и ~ операторов; и операнды операторов сдвига.

  • Целочисленный ранг конверсии: ни один из двух подписанных целочисленных типов не должен иметь одинаковый ранг, даже если они имеют одинаковое представление. Ранг целочисленного типа со знаком должен быть больше ранга любого знакового целочисленного типа с меньшей точностью. Ранг long long int должен быть больше ранга long int, который должен быть больше ранга int, который должен быть больше ранга short int, который должен быть больше ранга signed char. Ранг любого беззнакового целочисленного типа должен быть равен рану соответствующего знакового целочисленного типа, если таковой имеется. Ранг любого стандартного целочисленного типа должен быть больше ранга любого расширенного целочисленного типа с одинаковой шириной. Ранг char должен быть равен рангам signed char и unsigned char. Ранг любого расширенного целочисленного типа со знаком, связанного с другим расширенным типом со знаком целого типа с той же точностью, определяется реализацией, но по-прежнему подчиняется другим правилам определения целочисленного ранга преобразования. Для всех целых типов T1, T2 и T3, если T1 имеет больший ранг, чем T2, а T2 имеет больший ранг, чем T3, то T1 имеет больший ранг, чем T3.
  • Обычные арифметические преобразования: если оба операнда имеют один и тот же тип, дальнейшее преобразование не требуется. Если оба операнда имеют один и тот же целочисленный тип (подписанный или без знака), операнд с типом ранга меньшего целочисленного преобразования преобразуется в тип операнда с большим рангом. Если операнд, имеющий целочисленный тип без знака, имеет ранг, больший или равный рангам другого операнда, операнд со знаком целочисленного типа преобразуется в тип операнда с целым числом без знака. Если тип операнда со знаком целочисленного типа может представлять все значения типа операнда с целым типом без знака, операнд с целым типом без знака преобразуется в тип операнда со знаком целочисленного типа. В противном случае оба операнда преобразуются в целочисленный тип без знака, соответствующий типу операнда со знаком целочисленного типа. Конкретные операции могут добавлять или изменять семантику обычных арифметических операций.
2
ответ дан garakchy 17 August 2018 в 14:49
поделиться

Caveat!

Конверсии происходят слева направо.

Попробуйте следующее:

int i = 3, j = 2;
double k = 33;
cout << k * j / i << endl; // prints 22
cout << j / i * k << endl; // prints 0
-1
ответ дан Habib 17 August 2018 в 14:49
поделиться
  • 1
    Это не из-за конверсии, а из-за приоритета оператора. j + i * k приведет к 101. – gartenriese 12 October 2015 в 13:48

Если вы исключаете неподписанные типы, есть упорядоченная иерархия: подписанный символ, короткий, int, long, long long, float, double, long double. Во-первых, все, что приходит перед int в приведенном выше, будет преобразовано в int. Затем, в двоичной операции, более низкий ранжированный тип будет преобразован в более высокий, и результаты будут типом высшего. (Вы заметите, что из иерархии, когда задействуются плавающая точка и интегральный тип, интегральный тип будет преобразован в тип с плавающей точкой.)

Unsigned усложняет ситуацию: он возмущает ранжирование и части ранжирования становятся определяемыми. Из-за этого лучше не смешивать подписанные и unsigned в одном выражении. (Большинство экспертов на C ++, похоже, избегают беззнакового, если не задействованы побитовые операции. То есть, по крайней мере, то, что рекомендует Stroustrup.)

3
ответ дан James Kanze 17 August 2018 в 14:49
поделиться
  • 1
    Stroustrup может порекомендовать то, что ему нравится, но использование знака int для числа, которое никогда не должно быть отрицательным, является полной потерей полного 50% доступного диапазона. Я, конечно, не Stroustrup, но по умолчанию использую unsigned, а signed - только когда у меня есть причина. – underscore_d 18 December 2015 в 02:08

Так как другие ответы не говорят о правилах на C ++ 11, вот один из них. Из стандарта C ++ 11 (проект n3337) §5 / 9:

Этот шаблон называется обычными арифметическими преобразованиями , которые определены следующим образом:

. Если какой-либо из операндов имеет тип перечисления с областью действия, конверсии не выполняются; если другой операнд не имеет одного и того же типа, выражение плохо сформировано.

- Если один из операндов имеет тип long double, другой должен быть преобразован в длинный двойной.

- В противном случае, если один из операндов является двойным, другой должен быть преобразован в double.

- В противном случае, если один из операндов является float, другой должен быть преобразован в float.

- В противном случае интегральные рекламные акции должны выполняться на обоих операндах. Затем для продвинутых операндов применяются следующие правила:

- Если оба операнда имеют один и тот же тип, дальнейшее преобразование не требуется.

- В противном случае, если оба операнда имеют подписанные целочисленные типы или оба имеют неподписанные целые типы, операнд с типом ранга меньшего целочисленного преобразования должен быть преобразован в тип операнда с большим рангом.

- В противном случае, если операнд, который имеет неподписанные целочисленный тип имеет ранг, больший или равный рану типа другого операнда, операнд со знаком целочисленного типа должен быть преобразован в тип операнда с целым целым целым числом.

- в противном случае, если тип операнда со знаком целочисленного типа может представлять все значения типа операнда с беззнаковым целочисленным типом, операнд с беззнаковым целым типом должен быть преобразован в тип операнда со знаком целочисленного типа.

- В противном случае оба операнда должны быть преобразованы в unsi gned integer type, соответствующий типу операнда со знаком целочисленного типа.

См. здесь для часто обновляемого списка.

15
ответ дан legends2k 17 August 2018 в 14:49
поделиться

Арифметические операции с float приводят к float.

int + float = float
int * float = float
float * int = float
int / float = float
float / int = float
int / int = int

Для более подробного ответа. Посмотрите, что говорится в разделе §5 / 9 из стандарта C ++.

Многие двоичные операторы, которые ожидают операндов арифметического или перечисляемого типа, вызывают преобразования и вызывают типы результатов аналогичным образом. Цель состоит в том, чтобы дать общий тип, который также является типом результата.

Этот шаблон называется обычными арифметическими преобразованиями, которые определяются следующим образом:

- если либо операнд имеет тип long double, другой должен быть преобразован в длинный двойной.

- В противном случае, если один из операндов является двойным, другой должен быть преобразован в double.

- В противном случае, если любой операнд является float, другой должен быть преобразован в float.

- В противном случае интегральные рекламные акции (4.5) должны выполняться на обоих операндах. [54]

. Затем, если любой из операндов без знака длинный, другой должен быть преобразован в unsigned long.

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

- В противном случае, если один из операндов длинный, другой должен быть преобразован в длинный.

- В противном случае, если любой из операндов без знака, другой должен быть преобразован в unsigned.

[Примечание: в противном случае единственным оставшимся случаем является то, что оба операнда являются int]

28
ответ дан Nawaz 17 August 2018 в 14:49
поделиться
  • 1
    ... пока другой тип не является ни double, ни long double. – CB Bailey 6 April 2011 в 08:53
  • 2
    @Charles: Правильно. Я процитировал соответствующий раздел из Стандарта для дальнейшего уточнения. – Nawaz 6 April 2011 в 08:58
  • 3
    Так может ли целое число всегда быть преобразовано в float без потери данных? (например, путем обнуления экспоненты и использования всего для мантиссы)? – Marco A. 25 February 2014 в 15:25
  • 4
    Этот ответ устарел. Предложите обновление. В частности, long long и unsigned long не рассматриваются здесь. – chux 7 January 2016 в 19:39
Другие вопросы по тегам:

Похожие вопросы: