powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / MSVS 2017: не могу в функцию с аргументом типа int передать значение -2147483648
9 сообщений из 9, страница 1 из 1
MSVS 2017: не могу в функцию с аргументом типа int передать значение -2147483648
    #39627344
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MS VS 2017 (CE), проект С++.

Код: plaintext
1.
2.
3.
int f(int a){
...
};



При попытке вызвать f() c параметром, равным -214748364 8
Код: plaintext
1.
int n = f(-2147483648);


- компиляции обламывается с сообщением об ошибке:
error C4146: применение унарного минуса к типу без знака; результат оставлен без знака
Если значение параметра от -214748364 7 или больше - все ОК.
Если вызываю
Код: plaintext
1.
int n = f(2147483648);// без минуса


- то без проблем компилируется, "большое" значение приводится к знаковому int, в отладчике вижу ожидаемое значение - 214748364 8 .

Сие обескураживает. Всегда был уверен, что значение знаковых 32-битных целых живет в диапазоне от -214748364 8 до 214748364 7 .

Тынц в MSDN.

Прокомментируйте, пожалуйста.
...
Рейтинг: 0 / 0
MSVS 2017: не могу в функцию с аргументом типа int передать значение -2147483648
    #39627345
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Проверил с другими signed типами: signed char (-128..127) и short (-32768..32767) - все без проблем, только с int такая странность...
...
Рейтинг: 0 / 0
MSVS 2017: не могу в функцию с аргументом типа int передать значение -2147483648
    #39627346
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно без объявления функций, просто переменной типа signed int присваивая значения:
Код: plaintext
1.
2.
3.
4.
5.
6.
	int a = -2147483648; // Ошибка C4146
	int a = -2147483647; // Ошибки нет.
	int a =  2147483648; // Ошибки нет, значение инициализируется как -2147483648.
	int a =  0x80000000; // Ошибки нет.
...
	cout << a << endl;



Баг, что ли?
...
Рейтинг: 0 / 0
MSVS 2017: не могу в функцию с аргументом типа int передать значение -2147483648
    #39627354
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Котовасия, если не полениться посмотреть в limits.h там есть
Код: plaintext
1.
#define INT_MIN     (-2147483647 - 1)


Есть в с++ концепция числового литерала При отсутствии суффиксов тип у литерала по умолчанию будет int, но если значение не помещается в int, то тип будет unsigned int. А 2147483648 в int не помещается.
Ну а '-' это не часть числового литерала, это применение к значению операции унарного минуса. Что собственно и написано в сообщении об ошибке.
...
Рейтинг: 0 / 0
MSVS 2017: не могу в функцию с аргументом типа int передать значение -2147483648
    #39627356
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,

спасибо!
...
Рейтинг: 0 / 0
MSVS 2017: не могу в функцию с аргументом типа int передать значение -2147483648
    #39627671
Котовасия
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneКотовасия, если не полениться посмотреть в limits.h там есть
Код: plaintext
1.
#define INT_MIN     (-2147483647 - 1)


Есть в с++ концепция числового литерала При отсутствии суффиксов тип у литерала по умолчанию будет int, но если значение не помещается в int, то тип будет unsigned int. А 2147483648 в int не помещается.
Ну а '-' это не часть числового литерала, это применение к значению операции унарного минуса. Что собственно и написано в сообщении об ошибке.
По ссылке указано, что тип будет long long (64 битный), а вовсе не unsigned int. Насчет unsigned int сказано в описании ошибки, противоречие то есть.
Пишут, что если использовать (современный) gcc, подобной ошибки компиляции не будет.

Поискал - в интернете давно по сему поводу ругачки: "в соответствии со стандартом" (см. 5.13.2) - long long (64), а в описании ошибки C4146 - unsigned int и рекомендация использовать INT_MIN.
Похоже, что компилятор C++ пока не "тянет" все новую фичи.

Спасибо еще раз.
...
Рейтинг: 0 / 0
MSVS 2017: не могу в функцию с аргументом типа int передать значение -2147483648
    #39627731
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вообще, очень странная проблема.
...
Рейтинг: 0 / 0
MSVS 2017: не могу в функцию с аргументом типа int передать значение -2147483648
    #39627738
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Действительно, современным стандартам не соответствует. А вот в старом стандарте С не было типа long long
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
MSVS 2017: не могу в функцию с аргументом типа int передать значение -2147483648
    #39901035
ёёёёё
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотри-ка, исправили: https://developercommunity.visualstudio.com/content/problem/229901/c-compiler-an-error-occurring-while-initializing-t.html

Правда, пока лишь в MSVS-2019.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / MSVS 2017: не могу в функцию с аргументом типа int передать значение -2147483648
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]