Описание тега integer-promotion

Все, что связано с продвижением целых чисел C и C++, т.е. класс преобразований типов данных, который происходит автоматически, когда объект целочисленного типа появляется в определенных контекстах (например, когда значение типа short добавляется к int, оно автоматически преобразован в тип ʻint` перед выполнением операции).
3 ответа

Целочисленная раскрутка - какие шаги

Этот код печатает B2 short a=-5; unsigned short b=-5u; if(a==b) printf("A1"); else printf("B2"); Я читал о целочисленном продвижении, но мне все еще неясно, как это работает в приведенном здесь примере? Может кто-нибудь тщательно опубликовать шаги, …
06 мар '13 в 19:05
4 ответа

Почему целочисленные типы повышаются во время добавления в C?

Таким образом, у нас возникла проблема с полем, и после нескольких дней отладки мы сузили проблему до этого конкретного фрагмента кода, где обработка в цикле while не происходила: // heavily redacted code // numberA and numberB are both of uint16_t …
23 апр '15 в 08:34
2 ответа

С ++ отрицание и разрешение перегрузки

В Microsoft Visual Studio 2015 следующий код: void foo(int8_t a); void foo(int16_t a); void foo(int16_t a, int16_t b); void f() { int8_t x /* = some value */; foo(-int16_t(x)); // ERROR } Дает следующее сообщение: foo Error: more than one instance o…
27 мар '16 в 06:57
2 ответа

Позволяет ли C++ неявно преобразовывать любой целочисленный литерал в короткий int?

int main() { short n1 = 8ll; // no warning // warning C4305: 'initializing': truncation from '__int64' to 'short' // warning C4309: 'initializing': truncation of constant value short n2 = 88888ll; } Мой компилятор - Visual Studio 2017. Согласно cppr…
5 ответов

Если char c = 0x80, почему printf("%d\n", c << 1) выдает -256?

#include&lt;stdio.h&gt; int main(void) { char c = 0x80; printf("%d\n", c &lt;&lt; 1); return 0; } Выход -256 в этом случае. Если я напишу c &lt;&lt; 0 тогда вывод -128, Я не понимаю логику этого кода.
22 окт '10 в 23:25
2 ответа

В чем разница между целочисленной рекламой и целочисленной конверсией в C++

Раздел 4.5 стандарта C++ (целочисленное продвижение) говорит о конкретных случаях преобразования целочисленных типов в типы с более высоким рангом. Раздел 4.7 стандарта C++ (интегральные преобразования) начинается с (п. 4.7.1): Значение r целого тип…
09 янв '11 в 17:24
4 ответа

Что происходит, когда в выражении C происходит целочисленное переполнение?

У меня есть следующий код C: uint8_t firstValue = 111; uint8_t secondValue = 145; uint16_t temp = firstValue + secondValue; if (temp &gt; 0xFF) { return true; } return false; Это альтернативная реализация: uint8_t firstValue = 111; uint8_t secondVal…
04 окт '14 в 18:23
1 ответ

Почему не common_type<long, unsigned long>:: type = long long?

common_type&lt;long, unsigned long&gt;::type является unsigned long потому что относительно операндов после интегрального продвижения стандарт говорит... [...] если операнд с целым типом без знака имеет ранг, больший или равный рангу типа другого оп…
04 мар '13 в 21:26
2 ответа

Преобразование long-endian long в C++?

Мне нужна функция C++, которая возвращает значение четырех последовательных байтов, интерпретируемых как бигендовская длина. Указатель на первый байт должен быть обновлен, чтобы указывать после последнего. Я пробовал следующий код: inline int32_t bi…
06 окт '15 в 07:20
2 ответа

Функция шаблона C++ для сравнения любых целых чисел без знака и со знаком

Я хотел бы реализовать шаблонную функцию, которая сравнивает две переменные двух типов (T1 и T2). Эти типы являются двумя случайными целыми типами без знака или со знаком. Чтобы иметь возможность сравнивать их правильно, мне нужно привести их обоих …
28 окт '18 в 00:18
1 ответ

Понимание 2^31 и -2^31 целочисленного продвижения

#include &lt;stdio.h&gt; int main() { printf("sizeof(int): %zu\n", sizeof(int)); printf("%d\n", 2147483648u &gt; -2147483648); printf("%d\n", ((unsigned int)2147483648u) &gt; ((int)-2147483648)); printf("%d\n", 2147483648u != -2147483648); printf("%…
01 фев '16 в 12:45
2 ответа

C sprintf разрывается с байтовыми параметрами (компилятор Keil)

У меня есть код, работающий в 2 проектах / платформах. Это работает в одном, а не в другом. Код выглядит так: uint8_t val = 1; uint8_t buff[16]; sprintf(buff, "%u", val); Ожидаемый результат - "1" (gcc), но на одном компиляторе (Keil) он возвращает …
18 сен '15 в 04:26
2 ответа

Передача по ссылке и комплексное продвижение

Почему компилятор не может продвигать char в int&amp; но не имеет проблем при передаче его по ссылке на const (char в int const&amp;)? Пример кода: #include &lt;iostream&gt; using namespace std; void func1(int &amp; i) { cout &lt;&lt; "int &amp; " &…
4 ответа

Интегральное продвижение при передаче и возврате аргумента по ссылке?

Я читаю кое-что о разрешении перегрузки, и я нашел то, что беспокоит меня... В следующем коде: int const&amp; MaxValue(int const&amp; a, int const&amp; b) { return a &gt; b ? a : b; } void SomeFunction() { short aShort1 = 3; short aShort2 = 1; int c…
1 ответ

Как избежать интегрального продвижения для побитовых операций

Я поражен, что VisualStudio 2015 настаивает на продвижении WORD (unsigned short) для unsigned int когда только WORD значения участвуют только в битовых манипуляциях. (т. е. повышает 16 бит до 32 бит при выполнении 16 бит | 16 бит). например // where…
29 ноя '16 в 18:31
1 ответ

Можете ли вы объяснить это - "правила, включающие смешанные типы операндов, не применяются к операторам сдвига"

Я не могу понять строку "Результат сдвига имеет тот же тип, что и сдвинутая вещь (после интегральных повышений)" в следующем отрывке из книги С Майка Банахана (раздел 2.8.2.3). Важно отметить, что правила, включающие смешанные типы операндов, не при…
1 ответ

Компилятор независимое выражение арифметические преобразования и целочисленные продвижения

Предположим, у нас есть присваивание с использованием переменных следующих типов: uint64 = uint16 + uint16 + uint32 + uint64 Предположим, мы знаем, что результирующее значение r вписывается в uint64, если вся работа выполняется с использованием uint…
13 авг '13 в 22:10
4 ответа

Различные типы данных - подписанные и неподписанные

Я только что выполнил следующий код main() { char a = 0xfb; unsigned char b = 0xfb; printf("a=%c,b=%c",a,b); if(a==b) { printf("\nSame"); } else { printf("\nNot Same"); } } Для этого кода я получил ответ как а =? б =? Разные Почему я не получаю Same…
12 сен '17 в 19:29
3 ответа

Повышение при оценке константных целочисленных выражений в директивах препроцессора - GCC

ПРИМЕЧАНИЕ. См. Мои правки ниже. ОРИГИНАЛЬНЫЙ ВОПРОС: Наткнулся на какое-то любопытное поведение, с которым я не могу смириться: #if -5 &lt; 0 #warning Good, -5 is less than 0. #else #error BAD, -5 is NOT less than 0. #endif #if -(5u) &lt; 0 #warnin…
21 июл '15 в 16:47
2 ответа

Левый сдвиг и правый сдвиг на логическом

Я пытаюсь понять, как интегральное продвижение работает с операторами арифметических сдвигов. В частности, я хотел бы знать, какие значения a, b, c, d, e, f, g, h точно определены в соответствии со стандартом C++14, и какие из них могут зависеть от …
13 окт '15 в 18:51