Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.71/34: Рейтинг темы: голосов - 34, средняя оценка - 4.71
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484

Конвертация с long unsigned в int ошибка

03.02.2020, 20:52. Показов 7649. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
warning: conversion to ‘long unsigned int’ from ‘int’ may change the sign of the result [-Wsign-conversion]
offset == 2? offset = 4 : offset ==4? offset = 6 :offset == 6? offset = 2,i+=8: throw("Base64ToASCII error");
C++
1
int offset = 2;
компилятор выдает странную ошибку, как пофиксить?
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
03.02.2020, 20:52
Ответы с готовыми решениями:

Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в степень p
Требуется написать функцию long long pow(long long a, unsigned int p), которая возводит число a в степень p и возвращает ap. Помогите...

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

Перевести long long unsigned int в массив char
Подскажите, пожалуйста, как превратить число типа long long unsigned int в массив символов? Каждый символ - цифра числа в 16-значной...

45
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
03.02.2020, 23:40
Студворк — интернет-сервис помощи студентам
Цитата Сообщение от IGPIGP Посмотреть сообщение
При инициализации с auto?
???
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2020, 00:05
Цитата Сообщение от DrOffset Посмотреть сообщение
???
Я привык что тип определяется объявлением или выводится. Для простой переменной целого типа тип может быть выведентак например
C++
1
2
3
4
5
auto auUl=1?12,123ul:0;
std::cout<<auUl<<std::endl;//ul
int a=-(auUl+1);
auUl=a;
std::cout<<auUl<<std::endl;//ужасть как много)
и я думал вы об этом. В коде я не нашёл строки из текста ошибки хотя ТС мог бы её выделить или только её и выложить. Но я предположил развите событий как-то так, например
C++
1
2
3
int i=-9;
unsigned offset=0?123:i+=8;//i=-1 и Бум!
std::cout<<offset<<std::endl;//ужасть как много)
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
04.02.2020, 00:08
Цитата Сообщение от IGPIGP Посмотреть сообщение
и я думал вы об этом.
Нет, я о том, что у выражений в С++ есть тип. То, что можно вывести тип переменной исходя из выражения инициализации с помощью auto, в общем-то отношения к тему не имеет.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2020, 00:16
Цитата Сообщение от DrOffset Посмотреть сообщение
Нет, я о том, что у выражений в С++ есть тип. То, что можно вывести тип переменной исходя из выражения инициализации с помощью auto, в общем-то отношения к тему не имеет.
Но тогда я опять вас не понял. Тип определён объявлением наверно. То есть, я так понял, что тип offset объявлен unsigned long явно. А тип i где-то объявлен как int. Но выражение i+=8 - последнее и его значение равно чему оно равно и имеет тип int. Однако присвоение делается последнему значению после запятой и преобразование int to unsigned long неизбежно. Компилятор вроде о том говорит:
warning: conversion to ‘long unsigned int’ from ‘int’
и если i+=8 отрицательно, то беда. Я это имел ввиду. А если оно положительно или ноль, то будет работать. Хотя и плохо. Это случай когда преобразование потенциально опасно но будет работать верно. О том что тип определяется последним после запятой значением, конечно не важно.
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
04.02.2020, 00:18
Цитата Сообщение от ReYalp Посмотреть сообщение
он первый раз был 2 ,потом 4, потом 6 и так по кругу
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
 
 
int main()
{
    int value = 2;
    for(int i = 0; i < 100; ++i) {
        value = ((value + 2) | (value + 2) >> 2) & ~9;
        std::cout << value << ' ';        
    }
}
Добавлено через 1 минуту
https://rextester.com/ZTXJ28897
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
04.02.2020, 00:39
Цитата Сообщение от IGPIGP Посмотреть сообщение
То есть, я так понял, что тип offset объявлен unsigned long явно. А тип i где-то объявлен как int.
Наоборот.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Но выражение i+=8 - последнее и его значение равно чему оно равно и имеет тип int.
Имеет тип unsigned long.
Последнее оно в выражении с запятой. Все выражение с запятой имеет тип своего последнего подвыражения.

Цитата Сообщение от IGPIGP Посмотреть сообщение
i+=8 отрицательно, то беда.
В данном случае все наоборот. И беды не будет, т.к. результат условного оператора никак не используется.

Цитата Сообщение от IGPIGP Посмотреть сообщение
Но тогда я опять вас не понял.
Я все написал в #16

Добавлено через 7 минут
IGPIGP, прошу прощения, если я не прав в своем предположении, но мне верно показалось, что вы считаете, что выражение
C++
1
offset = 2,i+=8
в
C++
1
offset == 2? offset = 4 : offset ==4? offset = 6 :offset == 6? offset = 2,i+=8: throw("Base64ToASCII error");
трактуется как
C++
1
offset = (2, i+=8)
Если это так, то вы ошибаетесь.
Оно трактуется как
C++
1
(offset = 2), (i += 8)
Именно поэтому выражение i += 8 влияет на условное выражение (на все выражения).
Из-за него тип всего выражения
C++
1
((offset = 2), (i += 8))
становится unsigned long. А следом и тип всех условных выражений тоже.
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2020, 00:44
Цитата Сообщение от DrOffset Посмотреть сообщение
Наоборот.
Я не нашёл в коде этой строки. Если покажете где - буду благодарен. А исходил я из
Цитата Сообщение от ReYalp Посмотреть сообщение
conversion to ‘long unsigned int’ from ‘int’
По вашей логике преобразование идёт из long unsigned int to (-> в ) int. А компилятор наоборот пишет.

Добавлено через 2 минуты
Цитата Сообщение от DrOffset Посмотреть сообщение
Если это так, то вы ошибаетесь.
Оно трактуется как
А-а-а... Подумаю, - спасибо.
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
04.02.2020, 00:44
Цитата Сообщение от IGPIGP Посмотреть сообщение
Я не нашёл в коде этой строки.
Вот
Цитата Сообщение от ReYalp Посмотреть сообщение
C++
1
for(unsigned long i = 0;i < sizeof64*8-1;++i && ++pCharByteArray){
Тип i - unsigned long.
Цитата Сообщение от ReYalp Посмотреть сообщение
C++
1
int ch = 0,offset = 2;
Тип offset - int.
А вы пишете
Цитата Сообщение от IGPIGP Посмотреть сообщение
тип offset объявлен unsigned long явно
и
Цитата Сообщение от IGPIGP Посмотреть сообщение
А тип i где-то объявлен как int
1
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2020, 01:15
Цитата Сообщение от DrOffset Посмотреть сообщение
Вот
Хух нашёл - в конце первого фрагмента кода во третьем посте топика. Но присвоение же целого литерала 2 в int это не о том, что в сообщении. Или имеется ввиду преобразование при сравнении на равенство в условии?!
Я строчку вычитал из первого поста - сообщение компилятора и не обратил внимания на то, что первое выражение не присваивание, а сравнение. Смотрел сразу туда где
C++
1
offset = 2,i+=8
думая что это выражение для присвоения (ещё удивилмся зачем же столько раз то).
ReYalp, прошу прощения и у вас. Я подумал о вашем коде ещё хуже чем он есть в действительности. А ведь я не столь жесток по природе. Извините)
0
19506 / 10109 / 2464
Регистрация: 30.01.2014
Сообщений: 17,834
04.02.2020, 08:19
Цитата Сообщение от IGPIGP Посмотреть сообщение
Хух нашёл
Я же прямую ссылку дал (кнопка с двумя стрелками рядом с цитатой перенесет на цитируемое сообщение). Зачем искать?
Цитата Сообщение от IGPIGP Посмотреть сообщение
Но присвоение же целого литерала 2 в int это не о том, что в сообщении.
Цитата Сообщение от ReYalp Посмотреть сообщение
conversion to ‘long unsigned int’ from ‘int’
Смотрите #16 еще раз. Я там написал функцию, которая повторяет семантику условного выражения, написанного ТС. Из нее должно быть понятно откуда взялся warning.
Сравнение не при чем.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
04.02.2020, 11:28  [ТС]
IGPIGP, да чем мой код так не понравился?

Добавлено через 1 час 8 минут
Croessmah,
Цитата Сообщение от Croessmah Посмотреть сообщение
value = ((value + 2) | (value + 2) >> 2) & ~9;
один вопрос к этой строчке
зачем ~9 , а не 246?
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
04.02.2020, 11:30
Цитата Сообщение от ReYalp Посмотреть сообщение
~9
Потому что нужно сбросить нулевой и третий биты.
9 - это (0...0)1001b, ~9 - Это (1...1)0110b.
Применяем & и нужные биты сбрасываются.

Но ~9 - избыточно, просто выглядит страшнее.
Можно 6 поставить.
value = ((value + 2) | (value + 2) >> 2) & 6;
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
04.02.2020, 11:32  [ТС]
Croessmah, ну так 246 это и есть ~9 это во-первых, во-вторых можно сделать еще короче
C++
1
value = ((value + 2) | value  >> 1) & 246;
0
Неэпический
 Аватар для Croessmah
18150 / 10732 / 2067
Регистрация: 27.09.2012
Сообщений: 27,047
Записей в блоге: 1
04.02.2020, 11:39
Цитата Сообщение от ReYalp Посмотреть сообщение
ну так 246 это и есть ~9
246 это не ~9.
246 - (0...0)11110110
~9 - (1...1)11110110
Равны они только если у нас беззнаковое восьмибитное целое.
А это не так для выражения выше.
С натяжкой можно сказать, что ~9 == -10.
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2020, 11:52
Цитата Сообщение от ReYalp Посмотреть сообщение
IGPIGP, да чем мой код так не понравился?
Тернарная операция - уникально хорошая штука. Вы сделали с ней не печатное. Видя сообщение компилятора нужно было найти этот код (кликнув по сообщению) и показать как-то так:
C++
1
2
3
4
5
6
int ch = 0,offset = 2;////jобъявление offset 
 for(unsigned long i = 0;i < sizeof64*8-1;++i && ++pCharByteArray){//jобъявление i
//some code      
        offset == 2? offset = 4 : offset ==4? offset = 6 :offset == 6? offset = 2,i+=8: throw("Base64ToASCII error");
//some code          
    }
Трудно даже такой код читать и любить. Почему же мне это может понравиться? Ведь вы наверное хотели быстро получить ответ?
Это говорит о том что сила у вас есть, а распределяете вы её не оптимально.
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
04.02.2020, 11:55  [ТС]
Croessmah,
Цитата Сообщение от Croessmah Посмотреть сообщение
Но ~9 - избыточно, просто выглядит страшнее.
Можно 6 поставить.
кстати да,с 6 будет лучше, но мне кажется что есть вариант короче

Добавлено через 1 минуту
IGPIGP, насчет этого согласен , я понял свою ошибку что без документации не стоит что либо делать, но нельзя же весь код называть плохим, он разве прям такой плохой?
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2020, 11:57
Цитата Сообщение от ReYalp Посмотреть сообщение
IGPIGP, насчет этого согласен , я понял свою ошибку что без документации не стоит что либо делать, но нельзя же весь код называть ужасным, он разве прям такой ужасный?
Дык я сказал о том коде, в который воленс ноленс пришлось вникнуть. Или вы хотели ревью по всей простыне?
0
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
04.02.2020, 12:02  [ТС]
IGPIGP, я вообще-то для этого дажеотдельную тему создал, хочу что-то толковое создать, не смотря на то что оно работает там должно быть полным полно ошибок которые я пока еще (то ли от недостатка опыта , то ли еще от чего-то) не в состоянии заметить
0
Комп_Оратор)
Эксперт по математике/физике
 Аватар для IGPIGP
9007 / 4708 / 630
Регистрация: 04.12.2011
Сообщений: 14,003
Записей в блоге: 16
04.02.2020, 12:40
Цитата Сообщение от ReYalp Посмотреть сообщение
IGPIGP, я вообще-то для этого дажеотдельную тему создал, хочу что-то толковое создать, не смотря на то что оно работает там должно быть полным полно ошибок которые я пока еще (то ли от недостатка опыта , то ли еще от чего-то) не в состоянии заметить
Куча ошибок это работа. Дело даже не во времени и деньгах. Дело в принципе. Именно поэтому тут и установлено правило, - один выстрел - одно яблоко. Глядя на этот текст кода, эту длинющую тернарную операцию, это ваше последнее объяснение, глобальной задачи я могу сказать, что главная польза может для вас состоять в следующем:
Преодолейте желание длинных предложений (не жадничайте), где начало еще просматривается, а середина уже туманна. Концовку таких фраз трудно предсказать. Речь не о речи. Речь о подходе к решению задачи. Если вы поймёте о чем я, это будет огромное дело. Потом придётся, правда, себя по переделывать. Но в этом и состоит суть обучения.
Удачи)
1
63 / 46 / 11
Регистрация: 27.12.2017
Сообщений: 1,484
04.02.2020, 12:47  [ТС]
IGPIGP, та я таких сложных конструкций в коде своем никогда не использовал, а чтобы делать код хорошим как по мне нужен опыт, который можно получить на работе к примеру, но как найти работу если твой код не хороший ? это парадокс
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.02.2020, 12:47

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

Не понятный undefined reference to `unsigned long long f<unsigned long long, void>
test.cpp: #include &lt;iostream&gt; template &lt;typename FormalType, typename FactType = typename std::enable_if&lt;std::is_same&lt;FormalType,...

Как написать такое явное преобразование из double в unsigned long int
как написать такое явное преобразование из double в unsigned long int??? спасибо всем кто поможет...

Размер для данных (int, char, long, double, short, unsigned, float)
Напишите программу, которая будет определять размер для данных (int, char, long, double, short, unsigned, float) и выводить информацию (о...

Проблема с сравнением unsigned long long int числа
Написала программу для перевода чисел типа unsigned long long int с десятичной системы счисления в другую. Хочу сделать проверку оператором...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Книги по геймдизайну, левел-дизайну, игровым механикам и проектированию игрового опыта
8Observer8 08.11.2026
Содержание блога | English Version 1. 2003 - 06 - Designing Virtual Worlds (1st Edition) Автор: Richard A. Bartle | Объем: 768 стр. Ссылки: Amazon . . .
Родители токсичные абьюзеры по отношению к своим детям ругают их оскорбляют не любят
zorxor 08.11.2026
Жить в атмосфере постоянных оскорблений, критики и холодности со стороны родителей — это тяжелое и болезненное испытание, которое оставляет глубокие эмоциональные раны. Токсичное и абьюзивное. . .
Как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Ответ от Джемени ИИ.
zorxor 08.11.2026
Джемени, как только я захожу к себе в свою комнату я сразу же с себя снимаю свои трусы. Многие люди, возвращаясь домой, сразу переодеваются в максимально свободную одежду или вовсе предпочитают. . .
Паттерн очереди действий/команд (Action / Command Queue). Система очереди действий и кат-сцен с SDL3 Callbacks, cglm и OpenGL
8Observer8 07.11.2026
Содержание блога | English Version Руководство для начинающих по реализации паттерна очереди действий/ команд (Action / Command Queue) на C++ (C++20) с использованием официального SDL3 Callbacks. . .
Проверка полного ФИО в типовом справочнике
Maks 07.11.2026
Решение реализовано в конфигурации КА2, на примере справочника "КонтактныеЛицаПартнеров". Задача: Запрет инициалов. Не допускаеть использование сокращений вида "И. И. ", "И. И. ", "И И" и. . .
Про "Windows must die!"
kumehtar 04.11.2026
Знаете, чет накатило. . . . Когда-то это было почти боевым кличем: мол, нормальный человек сидит на DOS, OS/ 2 или Linux, а вот это вот - Must Die. А теперь человек произносит «мастдай» с усмешкой - и. . .
Красочные поля с номером страницы svg+background-image
russiannick 04.11.2026
Красочные поля с номером страницы не менее важны чем в эпоху бумажных книг. Посему спешу представить почтеннейшей публике этот важный инструмент который эти поля и формирует. В процессе разработки. . .
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru