Описание тега 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…
04 май '17 в 09:38
5
ответов
Если char c = 0x80, почему printf("%d\n", c << 1) выдает -256?
#include<stdio.h> int main(void) { char c = 0x80; printf("%d\n", c << 1); return 0; } Выход -256 в этом случае. Если я напишу c << 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 > 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<long, unsigned long>::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 <stdio.h> int main() { printf("sizeof(int): %zu\n", sizeof(int)); printf("%d\n", 2147483648u > -2147483648); printf("%d\n", ((unsigned int)2147483648u) > ((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& но не имеет проблем при передаче его по ссылке на const (char в int const&)? Пример кода: #include <iostream> using namespace std; void func1(int & i) { cout << "int & " &…
19 мар '16 в 11:18
4
ответа
Интегральное продвижение при передаче и возврате аргумента по ссылке?
Я читаю кое-что о разрешении перегрузки, и я нашел то, что беспокоит меня... В следующем коде: int const& MaxValue(int const& a, int const& b) { return a > b ? a : b; } void SomeFunction() { short aShort1 = 3; short aShort2 = 1; int c…
04 июл '10 в 14:57
1
ответ
Как избежать интегрального продвижения для побитовых операций
Я поражен, что VisualStudio 2015 настаивает на продвижении WORD (unsigned short) для unsigned int когда только WORD значения участвуют только в битовых манипуляциях. (т. е. повышает 16 бит до 32 бит при выполнении 16 бит | 16 бит). например // where…
29 ноя '16 в 18:31
1
ответ
Можете ли вы объяснить это - "правила, включающие смешанные типы операндов, не применяются к операторам сдвига"
Я не могу понять строку "Результат сдвига имеет тот же тип, что и сдвинутая вещь (после интегральных повышений)" в следующем отрывке из книги С Майка Банахана (раздел 2.8.2.3). Важно отметить, что правила, включающие смешанные типы операндов, не при…
21 сен '14 в 18:18
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 < 0 #warning Good, -5 is less than 0. #else #error BAD, -5 is NOT less than 0. #endif #if -(5u) < 0 #warnin…
21 июл '15 в 16:47
2
ответа
Левый сдвиг и правый сдвиг на логическом
Я пытаюсь понять, как интегральное продвижение работает с операторами арифметических сдвигов. В частности, я хотел бы знать, какие значения a, b, c, d, e, f, g, h точно определены в соответствии со стандартом C++14, и какие из них могут зависеть от …
13 окт '15 в 18:51