Свежее Поиск
Общие форумы
Специализированные форумы
ПроцессорыРазгон и охлаждениеСистемные платыМодули памятиВидеосистемаTV- и FM-тюнеры, видеовход, видеовыходЦифровое видео: захват, монтаж, обработкаМониторы и другие устройства отображенияЦифровое фотоБеспилотные летательные аппаратыЦифровой звукProAudio: Профессиональное звуковое оборудованиеСтереосистемыДомашний кинотеатр: проигрыватели и источники сигналаДомашний кинотеатр: аудиосистемаДомашний кинотеатр: ТV и проекторыМагнитные и SSD накопителиОптические носители информацииСетевые носители информацииПериферияКорпуса, блоки питания, UPSСети, сетевые технологии, подключение к интернетуСистемное администрирование, безопасностьСерверыНоутбуки, нетбуки и ультрабукиПланшеты и электронные книгиМобильные телефоны, смартфоны, кпк, коммуникаторыМобильные гаджетыОператоры и технологии мобильной связиТелефония, телекоммуникации, офисные АТСБытовая техника
Программы
Игры
Авторские форумы
Прочие форумы
Форумы поддержки портала iXBT.com
Архивы конференции
Бесплатные объявления KOMOK.comАрхив "О Конференции"Архив "Процессоры"Архив "Разгон и охлаждение"Архив "Системные платы"Архив "Модули памяти"Архив "Видеосистема"Архив "Видеозахват"Архив "Мониторы и другие устройства отображения"Архив "Цифровое изображение"Архив "Цифровой звук"Архив "Периферия"Архив "Корпуса, блоки питания, UPS"Архив "Коммуникации: сети и сетевые технологии"Домашний интернет, модемы (архив)Архив "Системное администрирование, безопасность"Архив "Мобильная связь"Программы Microsoft: Windows, Office, Server, Windows LiveАрхив "OС и системное ПО"Архив "Программы: Интернет"Архив "Программирование"Форум прикладных программистовАрхив "Электронные устройства и компоненты"Архив "Околокомпьютерный Флейм & Общий"Архив "Полемика (Злобный Флейм)"Околоавтомобильный ФлеймФорум ремонтниковВопросы компании IntelФотокамеры SamsungФорум о магазине приложений RuStoreФорум по продукции компании Huawei
Справка и сервисы
Другие проекты iXBT.com
🔥 Конференции iXBT.com — 25+ лет! Мы ищем модераторов-волонтёров.
Если форум "Программирование" вам дорог — помогите его сохранить!

Почему это важно и что происходит?
Worry
unregistered
Автор темы
Ответить
W
Worry unregistered Автор темы
23 года назад / 19 марта 2003 22:59
Вот такой наболевший (а может, даже, и риторический ) вопрос. В STL очень популярен тип size_type - по существу, unsigned int. Многие же программисты unsigned не любят, потому как неудобен он очень. И вот частенько приходиться состыковывать код, в котором все длины/индексы и т.п. представлены int'ами с кодом, активно использующим STL.

И вот хотелось бы узнать, какие тут возможны решения, кроме как
1) Уговорить любителей интов переделать всё их добро под size_type (или наоборот )
2) Навтыкать в коде кучу явных приведений типов (int), static_cast<int>, которые считаются дурным стилем и говорят о том, что программа плохо продумана.

Вроде и мелочь, а противная. Интересно, кто как борется

ЗЫ. Сорри, если совсем оффтоп
QZ
Coordinator
3547/5835 ответов
25 лет на iXBT, с июня 2000
Чаще пишет в "Программирование" (62%)
Инфо Ответить
Q
QZ Coordinator
23 года назад / 20 марта 2003 00:46
Многие же программисты unsigned не любят, потому как неудобен он очень.
это чем это
Dilmah
Member
217/464 ответов
23 года на iXBT, с сентября 2002
19 фото на iXBT.photo
Чаще пишет в "Общий" (36%)
Аргентина
Web-страница
Инфо Ответить
D
Dilmah Member
23 года назад / 20 марта 2003 01:33
const по моему еще хуже -- с unsigned и signed вроде только варнинги, нет? А с const действительно разбираться надо..
Kid_Deceiver
Moderator
4473/4563 ответов
25 лет на iXBT, с декабря 1999
Чаще пишет в "Программирование" (94%)
Инфо Ответить
K
Kid_Deceiver Moderator
23 года назад / 20 марта 2003 06:12
Вообще-то, если уж используешь библиотеку, так используй и типы определенные в ней (и ей требуемые).

Уговорить любителей интов переделать всё их добро под size_type или наоборот
Поскольку "наоборoт" явно не получится, взывайте к разуму программистов. Внушайте им (гипнозом, угрозой увольнения или повышением зарплаты) что всякие size_type, size_t придуманы отнюдь не зря.
psnsergey
Member
38/93 ответов
23 года на iXBT, с июля 2002
Чаще пишет в "Политика" (47%)
Россия, Москва
Инфо Ответить
psnsergey Member
23 года назад / 20 марта 2003 06:23
Если залезть в асм, то с unsigned, например, такое дело как {UINT b = fff(); UINT a = b / 32} сводится к поразрядному сдвигу, а с int было бы само деление! Эффективное применение переменных, по логике вещей должных принимать только неотриц. значения, требует объявления этого факта, чтоб компилер оптимизировал.
И создатели STL это хорошо понимали, в отличие от всяких программистов, которые суют ей signed, где его реально быть не может.
Kid_Deceiver
Moderator
4474/4564 ответов
25 лет на iXBT, с декабря 1999
Чаще пишет в "Программирование" (94%)
Инфо Ответить
K
Kid_Deceiver Moderator
23 года назад / 20 марта 2003 08:12
psnsergey
Если залезть в асм, то с unsigned... сводится к поразрядному сдвигу, а с int было бы само деление
Ничего подобного. Просто с unsigned будет shr, а с signed - sar (плюс мелкое телодвижение для получения smallest integer greater than the true quotient в случае отрицательных значений).
psnsergey
Member
39/94 ответов
23 года на iXBT, с июля 2002
Чаще пишет в "Политика" (47%)
Россия, Москва
Инфо Ответить
psnsergey Member
23 года назад / 20 марта 2003 09:34
Kid_Deceiver
Да?!! Это телодвижение раздует код всё равно. И медленнее будет однозначно. И в любом случае когда на "секретного завода плане" получается отрицательная длина из-за того, что программер не привык использовать UINT, это не есть гуд. Безопаснее там, где беззнаковое по смыслу, юзать беззнаковое по сути.
А как насчёт взятия остатка от деления на число - степнь двух - ведь остаток от отриц. числа д.б. отрицательным, маскирование применять нельзя?
Kid_Deceiver
Moderator
4476/4566 ответов
25 лет на iXBT, с декабря 1999
Чаще пишет в "Программирование" (94%)
Инфо Ответить
K
Kid_Deceiver Moderator
23 года назад / 20 марта 2003 10:44
А как насчёт взятия остатка от деления на число - степнь двух - ведь остаток от отриц. числа д.б. отрицательным, маскирование применять нельзя?
Все равно обойдется and и там и там. Но "телодвижение" вырастет до dec-or-inc.

Безопаснее там, где беззнаковое по смыслу, юзать беззнаковое по сути.
А разве кто-то с этим спорит?
psnsergey
Member
40/95 ответов
23 года на iXBT, с июля 2002
Чаще пишет в "Политика" (47%)
Россия, Москва
Инфо Ответить
psnsergey Member
23 года назад / 20 марта 2003 11:10
А разве кто-то спорит, что операциями and, dec, inc и условными переходами можно построить хоть машину Тьюринга? Другое дело, с какой скоростью она будет работать...
Sw.D.
unregistered
Ответить
S
Sw.D. unregistered
23 года назад / 20 марта 2003 11:34
Кстати, был момент, когда пришлось с size_t изрядно повозиться при портации с виндов на сан:
1int slen = sizeof(host);
2if ((sock = accept(lsn, host, &slen)) == -1)
Под саном работал один варнинг (или ошибка - не помню), под sco - другой, под виндой - третий (как ни крутись)..
Пришлось добавить
01#ifdef _WIN32
02typedef int msize_t;
03#else
04 #if defined(sun)
05typedef int msize_t;
06 #else
07typedef size_t msize_t;
08 #endif
09#endif
10  
11...
12    msize_t slen = sizeof(host);
13    if ((sock = accept(lsn, host, &slen)) == -1)
Только такой вариант был портабелен без ошибок и варнингов :)
Harkonnen
Member
919/1131 ответов
25 лет на iXBT, с февраля 2000
Чаще пишет в "Наука" (45%)
Инфо Ответить
H
Harkonnen Member
23 года назад / 20 марта 2003 12:14
ALL
Я везде юзаю size_t, но грабли с ним есть небольшие.

Например, такие выкрутасы приходится делать:

1for(size_t i = szLast ; i != szFirst - 1 ; i--) {/*...*/} // 'cause szFirst can be zero
psnsergey
Тогда вместо -100 получился 4'294'967'196

Но все равно это не оправдывает int'ы. Я int ипользую только там, где явная математика (координаты, произвольные числа и т.п.)
Worry
unregistered
Автор темы
Ответить
W
Worry unregistered Автор темы
23 года назад / 20 марта 2003 12:59
>>Многие же программисты unsigned не любят, потому как неудобен он очень.
>это чем это

а вот простой пример: нужно сделать цикл по всем элементам чего-то, кроме последнего
int-addicted programmer пишет:
1int i;
2int length = ...;
3for(i=0;  i<length-1; i++) do_something();
и всё у него работает

а вот если i и length сделать unsigned, то при length==0 (пустая строка, например), получает практически "вечный" цикл

понятно, что тут побороться легко - например, записать условие цикла как i+1<length (хотя это уменьшает прозрачность кода)

и таких примеров можно сколько угодно сочинить
главная проблема в том, что арифметика (вычитание) над unsigned может дать отрицательное число, которое будет рассматриваться как большое unsigned, что очень неудобно, т.к. вынуждает писать кучу (лишних, по существу) проверок
psnsergey
Member
41/96 ответов
23 года на iXBT, с июля 2002
Чаще пишет в "Политика" (47%)
Россия, Москва
Инфо Ответить
psnsergey Member
23 года назад / 20 марта 2003 15:14
Harkonnen
Не понял. Ты меня не так понял или решил научить основам цифровой техники и дополнительному представлению отрицательных? Я нигде не утверждал такого, что вместо -100 будет 4 миллиарда. На то компилер и делает "телодвижения", о которых так душевно толкует Kid_Deceiver
Пиво надо употреблять в меру

Worry
Посмотрел спецификацию... блин, действительно, надо же было в языке допустить такой ляп... ведь если два беззнаковых вычитаются, компилятору никак не следует ожидать, что первое больше. а они так и задали - мол, раз операнды такие, то и результат. Простые как 3 р.
Перегрузить вычитание целых, что ли
warper
unregistered
Ответить
w
warper unregistered
23 года назад / 20 марта 2003 15:33
Worry
Можно еще задавить все предупреждения такого типа прагмой. Но тоже не метод...

psnsergey
Перегрузить вычитание целых, что ли
А после этого каст устраивать каст на каждое вычитание?
Worry
unregistered
Автор темы
Ответить
W
Worry unregistered Автор темы
23 года назад / 20 марта 2003 15:40
Предупреждения это ещё ладно... Хотя тоже прикольно, когда при переключении в проекте Warning Level с 3 на 4 их таких несколько сотен появляется.

А вот потенциальные ошибки, которые это скрывает (приведённый выше ляп реально существовал и долго не проявлял себя)...

В общем, трагична жизнь человеческая
psnsergey
Member
42/97 ответов
23 года на iXBT, с июля 2002
Чаще пишет в "Политика" (47%)
Россия, Москва
Инфо Ответить
psnsergey Member
23 года назад / 20 марта 2003 17:53
warper
Ты что, какие касты. Просто операция вычитания беззнаковых возвращает беззнаковое. А в перегруженном сделать return int(a - b) - и всё. То же, только тип знаковый. Зачем касты, мы не в Индии
Delphi

In general, arithmetic operations on integers return a value of type Integer—which, in its current implementation, is equivalent to the 32-bit Longint. Operations return a value of type Int64 only when performed on an Int64 operand. Hence the following code produces incorrect results.
Вот это по уму!
Worry
unregistered
Автор темы
Ответить
W
Worry unregistered Автор темы
23 года назад / 20 марта 2003 18:32
Да, вот ещё

Огляделся по сторонам - а ведь много где int'ы используют
В MFC все индексы (CString, CArray и т.д.) - на интах. В VCL кажется, тоже.

Так как правильно всё-таки?
Dilmah
Member
225/472 ответов
23 года на iXBT, с сентября 2002
19 фото на iXBT.photo
Чаще пишет в "Общий" (36%)
Аргентина
Web-страница
Инфо Ответить
D
Dilmah Member
23 года назад / 20 марта 2003 18:49
psnsergey

если бы unsigned - unsigned было signed то тогда для очень многих unsigned X, безобидное выражение (X - 0) было бы неопределено.

А так -- ведь можно написать без явного каста:

unsigned a = 3;
unsigned b = 5;
int d = a - b;

и это будет работать. будет только варнинг, но нам на них плевать, мы знаем что делаем.
ndemia
Цербер... неместный
1168/1687 ответов
24 года на iXBT, с декабря 2000
Чаще пишет в "Программирование" (68%)
Web-страница
Инфо Ответить
n
ndemia Цербер... неместный
23 года назад / 20 марта 2003 20:23
psnsergey
и уж по крайней мере это не ляп в языке С самых давних времён в Си заведено: тип результата задаётся операндом с наибольшей разрядностью, и не о чем гадать - как бы ни менялись платформы и компиляторы. У unsigned разрядность значения на 1 бит больше (опять же, сколько бы бит не было в int).
psg
unregistered
Ответить
p
psg unregistered
23 года назад / 20 марта 2003 22:27
Классная тема!
Думать надо, когда пишете код!
Denis_03
Member
126/149 ответов
23 года на iXBT, с ноября 2001
3 фото на iXBT.photo
Чаще пишет в "Программирование" (68%)
Россия, Ростов-на-Дону
Инфо Ответить
D
Denis_03 Member
23 года назад / 20 марта 2003 23:28
Ещё по поводу неудобств с беззнаковыми типами: нужно быть очень осторожным при организации цикла с уменьшением счётчика:
1unsigned int i, length = ...;
2for (i = length;  i >= 0; i --)
3  do_something();     // Зациклились...
Worry
unregistered
Автор темы
Ответить
W
Worry unregistered Автор темы
23 года назад / 21 марта 2003 00:32
Kid_Deceiver
>Вообще-то, если уж используешь библиотеку, так используй и типы определенные в ней (и ей требуемые).

а если я использую две библиотеки - одна int-, а другая unsigned-style?

psg
неужто злорадствуете?
Kid_Deceiver
Moderator
4479/4569 ответов
25 лет на iXBT, с декабря 1999
Чаще пишет в "Программирование" (94%)
Инфо Ответить
K
Kid_Deceiver Moderator
23 года назад / 21 марта 2003 05:53
Worry
.а если я использую две библиотеки - одна int-, а другая unsigned-style?
Ну что я могу сказать... Мир жесток и несправедлив - делайте аккуратные касты.
Ваш ответ:

Нет значка Нет значка Вот тут! Лампочка Восклицание Вопрос Класс! Улыбка Злость Огорчение Поговорим? Краснею Подмигивание Ругаю ОдобряюBIUdelSxsupxsuboffsp spoilerqurlimgvideo• list1. list1 codeprecenter-hr-rusQWE→ЙЦУ
файлыочистить
Ваше имя: Авторизуйтесь Предпросмотр В полную форму
вставить выделенную цитату в окно ответа
Оставьте свою реакцию на сообщение
Ваши лимиты: 5 реакций/сутки
(купите Premium, чтобы увеличить)
Оставьте свою реакцию на сообщение
Ваши лимиты: 5 реакций/сутки
(купите Premium, чтобы увеличить)
Последние обсуждения в Конференции
02:19Выбор увлажнителя воздуха Бытовая техника
02:15Качество кодирования Nvidia NVENC Видеозахват
02:11Бег, бег и ещё раз бег Спорт
02:05Китайские автомобили. Обсудим? Авто
02:04Иммиграция. Как выжить за рубежом? Общий
02:02Предел техпроцесса Процессоры
02:02Кто-то хочет в СССР? История
02:01Будет ли война России с Украиной? Политика
02:01Выбор SSD Накопители
02:00Тихий/бесшумный компьютер. Разгон
02:00NVIDIA DLSS, AMD FSR, Intel XeSS и прочие "upscale"-технологии: вежливый холивар Видеосистема
01:59Copilot key (кнопка Copilot) как от нее избавиться и вернуть Ctrl ? OС и сист. ПО
01:49Реанимация microSD Card Память
01:46Пиво Кулинария
01:46Что нам не нравится в продукции Apple? Недостатки, косяки, баги, недоразумения. MacLife
01:28ОЗОН - как меня пытается обмануть российский универсальный интернет-магазин Рынок
01:28Выбор смартфона Моб. телефоны
01:22Любите ли вы Баха? Культура
01:22Выбор ресивера ДК аудио
01:17Выбор МФУ для офиса Периферия
02:0832 GPU, 768 ГБ видеопамяти и 10,8 кВт мощности. Sparkle представила сервер на базе 16 видеокарт Intel Arc Pro B60 Dual
22:18вчераBlue Origin доставила ускоритель New Glenn на стартовый комплекс для миссии NASA к Марсу
21:20вчераИ BMW, как и Tesla, обогнал Mercedes по продажам
20:33вчераВ Россию из Европы приехал Skoda Kodiaq с дизельным мотором, а также принимаются заказы на версии с бензиновым 190-сильным мотором и полным приводом: цены немалые
20:28вчераGoogle Chrome, Safari и Microsoft Edge больше не одиноки: Mozilla добавила в Firefox профили
20:13вчераКомета C/2025 A6 (Lemmon) даёт последний шанс увидеть её в октябрьском вечернем небе
20:10вчераДвухметровые кровати, душ, экраны и USB-разъёмы: на российские железные дороги вышли новые вагоны СВ
20:01вчераКома межзвёздной кометы 3I/ATLAS подтвердила новую теорию формирования комет
19:50вчераМиссия зонда NASA Juno вокруг Юпитера завершилась, но точный статус аппарата всё ещё неизвестен
19:43вчераBlue Origin успешно завершила 36-й пилотируемый полёт New Shepard с шестью пассажирами