Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.83/29: Рейтинг темы: голосов - 29, средняя оценка - 4.83
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144

Использование long вместо long int. Возможны ли подводные камни?

27.06.2019, 12:01. Показов 5622. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день.

Моя цель - писать кроссплатформенный C++ код, поэтому хочу отказаться от типа int (т.к. он непостоянный в разных платформах), и вместо long int использовать long.

Вопрос: Такой подход имеет подводные камни?

P.S.
Также буду признателен за другие советы, как писать кроссплатформенный C++ код?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
27.06.2019, 12:01
Ответы с готовыми решениями:

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

Вызвано исключение при инициализации массива long long int
long long int c = {}; Если убрать один long, программа запускается и работает нормально. Почему?

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

18
Злостный нарушитель
 Аватар для Verevkin
10311 / 5733 / 1269
Регистрация: 12.03.2015
Сообщений: 26,559
27.06.2019, 12:05
пиши int32_t и не парься.
0
 Аватар для Krokodil9798
330 / 145 / 56
Регистрация: 17.10.2015
Сообщений: 580
27.06.2019, 12:16
Цитата Сообщение от Artem_Pv Посмотреть сообщение
вместо long int использовать long
long - это сокращение записи long int (на повышение кроссплатформенности никак не влияет).
0
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
27.06.2019, 12:23  [ТС]
Цитата Сообщение от Verevkin Посмотреть сообщение
пиши int32_t и не парься.
Спасибо что откликнулись.
В этом и заключется вопрос темы: Что плохого в типе long (по сравнению с тем же int32_t) ?

Добавлено через 3 минуты
Цитата Сообщение от Krokodil9798 Посмотреть сообщение
long - это сокращение записи long int (на повышение кроссплатформенности никак не влияет).
Вроде, long безболезненно прошел 16,32,64-битные платформы?!
Чего нельзя сказать про int ?!
0
Злостный нарушитель
 Аватар для Verevkin
10311 / 5733 / 1269
Регистрация: 12.03.2015
Сообщений: 26,559
27.06.2019, 12:27
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Что плохого в типе long (по сравнению с тем же int32_t) ?
В том, что у тебя возникают подобные вопросы.
Понятно, что компайлеры бывают разные, и фундаментальные типы данных у них могут ВНЕЗАПНО не совпасть. Даже если они совпадают сейчас, то в будущем - хз, мож long будет 64 бит, а мож и все 128. Поэтому я и советую тебе (от всей души, кстати), юзать идентификаторы типов, с битностью в имени.



Не гарантирую, что абсолютно все компиляторы поддерживают эти типы, но об этом станет известно при первой попытке сборки исходников.
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.06.2019, 12:31
Цитата Сообщение от Artem_Pv Посмотреть сообщение
поэтому хочу отказаться от типа int
Это неверно. Не нужно отказываться. По крайней мере делать это без анализа вашей задачи, предметной области и требований к софту.

Цитата Сообщение от Artem_Pv Посмотреть сообщение
и вместо long int использовать long.
Это одно и то же.

Если вам нужна гарантированная разрядность, например при передаче сетевых пакетов, то используйте типы с фиксированной разрядностью. В остальных случаях, нет никакого смысла отказываться от зависимых от платформы типов. Они ведь специально такими сделаны, чтобы обеспечивать соответствующую производительность.
1
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
27.06.2019, 12:40
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Что плохого в типе long (по сравнению с тем же int32_t) ?
Вам же написали выше: его размер зависит от платформы и компилятора.
C++
1
2
3
4
5
6
7
8
#include <iostream>
 
int main() {
  std::cout << "int:  " << sizeof (int) << std::endl;
  std::cout << "long: " << sizeof (long) << std::endl;
  std::cout << "long long : " << sizeof (long long) << std::endl;
  return 0;
}
Вывод:
Bash
1
2
3
int:  4
long: 8
long long : 8
Добавлено через 2 минуты
PS. Из этого не следует, что в кроссплатформенных прогрммах всегда следует избегать int, long и т.д.
0
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
27.06.2019, 12:44  [ТС]
Цитата Сообщение от DrOffset Посмотреть сообщение
Не нужно отказываться.
Спасибо за ответ.
Моя цель и задачи - это кроссплатформенный С++ код, который не пострадает от разрядности 16,32,64... 128-bit ...
Я хочу отказаться от ключевого слова "int" (т.к. этот тип кажется ненадежным).

int32_t - немного режет глаз. Постфикс "_t" - для чего?

Вот, компактный тип long - коротко и надежно. Так, нет?
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.06.2019, 12:48
Лучший ответ Сообщение было отмечено Artem_Pv как решение

Решение

Цитата Сообщение от Artem_Pv Посмотреть сообщение
Вроде, long безболезненно прошел 16,32,64-битные платформы?!
Чего нельзя сказать про int ?!
И ничего плохого в этом нет. На кроссплатформенность это в общем случае не влияет.
Вы задачу свою проанализируйте и укажите какие аспекты в ней могут потребовать фиксированной или гарантированной минимальной разрядности.
Для фиксированной разрядности используйте типы int32_t, int8_t и т.д.
Для гарантированно минимальной разрядности используйте типы int_least32_t, int_least8_t и т.д. или int_fast32_, int_fast8_t и т.д.
В остальных случаях нет никакого смысла отказываться от базовых типов. Стандарт не описывает разрядность, но зато он описывает минимальные диапазоны. Этого в большинстве случаев достаточно, чтобы принять решение об использовании того или иного типа.
Также вот, например, POSIX существует на множестве платформ. И это никак не мешает ему эксплуатировать int в качестве основного интегрального типа.

Справочная информация здесь: https://en.cppreference.com/w/cpp/types/integer

Не занимайтесь борьбой с ветряными мельницами.
1
Злостный нарушитель
 Аватар для Verevkin
10311 / 5733 / 1269
Регистрация: 12.03.2015
Сообщений: 26,559
27.06.2019, 12:49
Цитата Сообщение от Artem_Pv Посмотреть сообщение
int32_t - немного режет глаз. Постфикс "_t" - для чего?
Какой ты привередливый, однако!
Не надо этот тип сувать во все места программы. Юзай только там, где НЕОБХОДИМО контролировать разрядность.
И не морочай дядям головы.
2
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.06.2019, 13:04
Вот ссылка на стандарт С. (С++ в этой части на него ссылается). http://www.open-std.org/JTC1/S... /n1256.pdf
На 22 странице даны минимальные диапазоны всех базовых типов. Любой компилятор, который соответствует стандарту, на любой платформе так или иначе будет их выдерживать.
1
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,914
27.06.2019, 13:14
Цитата Сообщение от Artem_Pv Посмотреть сообщение
int32_t - немного режет глаз. Постфикс "_t" - для чего?
Напрасно режетесь глазами об это. Насколько мне известно, подобные типы - единственные стандартные типы фиксированной разрядности. Они прописаны в стандарте языка в разделе stdint.h (inttypes.h). Суффикс _t и относительно длинные имена введены для совместимости со старым кодом, где использовались кустарные реализации переменных фиксированной размерности вроде u8, i16 и т.п. Имя типа int_least32_t достаточно неочевидное чтобы какой-нибудь Borland использовал в своих целях.
Кстати, помимо целочисленных типов есть еще wchar_t (любой символ Юникода, правда майкрософтовская реализация сделана криво), size_t (адресация любой ячейки памяти), pid_t (идентификатор процесса) и т.п.
В целом, если хотите переносимости на наиболее экзотические платформы, лучше действительно пользоваться стандартными типами фиксированной или гарантированной разрядности. Гарантированной - например int_fast32_t, который не обязательно 32 бита, но самый быстрый из типов, вмещающий диапазон 32-битного. Например, он может быть 51-битным (пример взят от балды).
1
1 / 1 / 0
Регистрация: 31.03.2019
Сообщений: 144
27.06.2019, 13:28  [ТС]
Ответ я нашел, всем спасибо.
Вопрос был немного “провокационный”, за что извиняюсь.

Цитата Сообщение от DrOffset Посмотреть сообщение
Не занимайтесь борьбой с ветряными мельницами.
Но, я то вижу великанов с большими руками. Их надо побороть ))

Цитата Сообщение от DrOffset Посмотреть сообщение
Вот ссылка на стандарт С
2007 год, но продолжают развивать стандарт языка Си.
Wow ... )
0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.06.2019, 13:35
Цитата Сообщение от Artem_Pv Посмотреть сообщение
2007 год, но продолжают развивать стандарт языка Си.
Он и в 2019 продолжает развиваться.
1
27.06.2019, 13:41

Не по теме:

Цитата Сообщение от Artem_Pv Посмотреть сообщение
Но, я то вижу великанов с большими руками. Их надо побороть ))
Так и до кащенко недалеко, батенька! :D
Я уверен, что это лечится такими медикаментами и процедурами, как:
а) курево
б) жорево
в) порево
ц) синево.

0
19500 / 10105 / 2461
Регистрация: 30.01.2014
Сообщений: 17,816
27.06.2019, 14:03
Лучший ответ Сообщение было отмечено Artem_Pv как решение

Решение

Цитата Сообщение от Artem_Pv Посмотреть сообщение
Их надо побороть
На ранних этапах наиболее опасная стратегия: "выберу-ка я себе шаблон поведения на все случаи жизни и буду ему следовать, чтобы избежать опасностей".
Собственно основная мысль, которую я вкладывал в свои посты следующая: никакого единого шаблона быть не может и выбирать его, значит заведомо ограничивать себя в знаниях и раскладывать вокруг себя грабли. На вашем конкретном примере выбор int32_t (или же long, не суть) в качестве основного целого типа чревато тем, что:
* вы будете испытывать трудности при взаимодействии с независящим от вас окружением, библиотечным кодом (на примере той же перегрузки из соседней вашей темы).
* вы будете испытывать трудности при переходе на платформу, где наиболее "быстрым" целым типом являются 64-битный или наоборот 16-битный целые. На ровном месте потеряете производительность кода.
* будут испытывать трудности те, кто возможно будет сопровождать ваш код, т.к. этот подход нарушает принцип наименьшего удивления (обычно так не делают потому что).

Добавлено через 18 минут
Да, и еще. Тотальной кроссплатформенности все равно не существует.
Да, вы можете написать функцию, которая будет работать и на pic16 и на каком-нибудь IBM Z, но вот уже сделать единый программный продукт будет невозможно. У каждой платформы есть особенности, и, вы либо будете их учитывать, либо терять множество возможностей из-за применения узкой прослойки одинаковых везде инструментов. Любая сложная программа - это не вещь в себе, она взаимодействует с окружением и это окружение везде разное. Также, в зависимости от платформы могут применяться совсем разные техники оптимизации, ввода-вывода и др.

Опять же на примере с int, на 16-битной платформе использование везде 32-битного целого может быть просто вредительством, т.к. эта "лишняя" разрядность не будет даваться бесплатно. Компилятору при генерации кода придется задействовать два регистра даже там (а это подавляющее большинство случаев), где хватило бы одного, безбожно расходуя и без того скудные ресурсы.
1
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
27.06.2019, 16:00
Цитата Сообщение от Artem_Pv Посмотреть сообщение
Моя цель - писать кроссплатформенный C++ код
Цитата Сообщение от Verevkin Посмотреть сообщение
пиши int32_t и не парься.
Открываем документацию:

http://www.cplusplus.com/reference/cstdint/

* Notice that some types are optional (and thus, with no portability guarantees).
Упсссс

Цитата Сообщение от Artem_Pv Посмотреть сообщение
как писать кроссплатформенный C++ код?
Стандартные решения,
Кроссплатформенные компоненты от серьёзных дядек,
Тесты, бенчмарки, пост и молитвы ))
0
 Аватар для COKPOWEHEU
4083 / 2681 / 432
Регистрация: 09.09.2017
Сообщений: 11,914
27.06.2019, 16:28
Цитата Сообщение от eva2326 Посмотреть сообщение
* Notice that some types are optional (and thus, with no portability guarantees).
Упсссс
Хм, а fast и least варианты такой отметки не имеют. В стандарте С11 тоже написано что least и fast варианты обязательны, а остальные - опциональны. Что ж, логика в этом есть.
0
285 / 176 / 21
Регистрация: 16.02.2018
Сообщений: 666
27.06.2019, 16:42
Цитата Сообщение от eva2326 Посмотреть сообщение
Открываем документацию:
http://www.cplusplus.com/reference/cstdint/
Это не документация, это шлак.
Так что открываем документацию. Например, драфт 11-го стандарта
Цитата Сообщение от http://port70.net/~nsz/c/c11/n1570.html#7.20.1.1p3
These types are optional. However, if an implementation provides integer types with widths of 8, 16, 32, or 64 bits, no padding bits, and (for the signed types) that have a two's complement representation, it shall define the corresponding typedef names.
Так фактически эти типы не optional.
Кликните здесь для просмотра всего текста
Ну и если учитывать что под кроссплатформой обычно понимают не голый стандарт C или C++, а, например, POSIX, то там типы шириной от 8 до 32 бит required, а не optional. (u)int64_t optional, если платформа не имеет 64-битных целых.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
27.06.2019, 16:42
Помогаю со студенческими работами здесь

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

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

Подскажите что за типа такой long long int?
Вопрос собственно сверху. Нигде не смог найти описания подобного типа

Максимальная и минимальная цифра числа long long int
Доброго времени суток! Подскажите, пожалуйста, как с помощью цикла (while, do while, for) определить максимальную и минимальную цифры числа...

long long int и его поведение в структуре
#include &lt;iostream&gt; struct IndexBase { public: int x; int y; int z; unsigned int lastChange; unsigned long long int...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru