Форум программистов, компьютерный форум, киберфорум
Vleo
Войти
Регистрация
Восстановить пароль
Рейтинг: 5.00. Голосов: 2.

uchar, ushort, uint, ulong надо ли?

Запись от Vleo размещена 13.01.2022 в 01:16

char
Целый тип char занимает в памяти 1 байт (8 бит) и позволяет выразить в двоичной системе счисления 2^8 значений=256. Тип char может содержать как положительные, так и отрицательные значения. Диапазон изменения значений составляет от -128 до 127.

uchar
Целый тип uchar также занимает в памяти 1 байт, как и тип char, но в отличие от него, uchar предназначен только для положительных значений. Минимальное значение равно нулю, максимальное значение равно 255. Первая буква u в названии типа uchar является сокращением слова unsigned (беззнаковый).

short
Целый тип short имеет размер 2 байта(16 бит) и, соответственно, позволяет выразить множество значений равное 2 в степени 16: 2^16=65 536. Так как тип short является знаковым и содержит как положительные, так и отрицательные значения, то диапазон значений находится между -32 768 и 32 767.

ushort
Беззнаковым типом short является тип ushort, который также имеет размер 2 байта. Минимальное значение равно 0, максимальное значение 65 535.

int
Целый тип int имеет размер 4 байта (32 бита). Минимальное значение -2 147 483 648, максимальное значение 2 147 483 647.

uint
Беззнаковый целый тип uint занимает в памяти 4 байта и позволяет выражать целочисленные значения от 0 до 4 294 967 295.

long
Целый тип long имеет размер 8 байт (64 бита). Минимальное значение -9 223 372 036 854 775 808, максимальное значение 9 223 372 036 854 775 807.

ulong
Целый тип ulong также занимает 8 байт и позволяет хранить значения от 0 до 18 446 744 073 709 551 615.

То есть по моим наблюдениям, если ты в программе (для повседневных задач, а не мат. вычислений) используешь или возможнеф наличие отрицательных чисел, то типы данных типа usigned тебе не понадобятся.
Размещено в Без категории
Показов 2170 Комментарии 24
Всего комментариев 24
Комментарии
  1. Старый комментарий
    Аватар для Алексей1153
    всё зависит от задачи

    если нужен знак, то char, int8_t, int16_t, int32_t,int64_t, ...
    если не нужен знак, то size_t, uint8_t, uint16_t, uint32_t, uint64_t, ...
    Запись от Алексей1153 размещена 13.01.2022 в 08:34 Алексей1153 на форуме
  2. Старый комментарий
    Цитата:
    Сообщение от Алексей1153 Просмотреть комментарий
    всё зависит от задачи

    если нужен знак, то char, int8_t, int16_t, int32_t,int64_t, ...
    если не нужен знак, то size_t, uint8_t, uint16_t, uint32_t, uint64_t, ...
    Мне такие задачи не встречались. Точнее говоря (а я решил много тысяч задач), беззнаковый тип переменных мне никогда не потребовался. То есть достаточно обычных типов переменных. Со знаком. А что дают беззнаковые типы переменных? Да ничего! Просто возьмите тип подлиннее и забудьте о переполнении. В математике надо решать задачу, а не подсчитывать байты!!!
    Запись от wer1 размещена 13.01.2022 в 09:44 wer1 вне форума
  3. Старый комментарий
    Аватар для Алексей1153
    wer1, а мне такие задачи постоянно встречаются. А вот со знаком - раз в год. Математика тоже не часто требуется, в общем-то.

    Цитата:
    А что дают беззнаковые типы переменных
    да возьмём даже просто индексацию массива/вектора или итерирование по ним
    Запись от Алексей1153 размещена 13.01.2022 в 09:52 Алексей1153 на форуме
    Обновил(-а) Алексей1153 13.01.2022 в 09:53
  4. Старый комментарий
    Аватар для Rius
    Ещё они для битовых полей. Или для положительных значений, которые в знаковый тип не влезают, а просто взять подлиннее - нельзя.

    int не всегда 4 байта, с остальными тоже не очевидно.
    Запись от Rius размещена 13.01.2022 в 11:27 Rius вне форума
  5. Старый комментарий
    Аватар для Rius
    ......
    Запись от Rius размещена 13.01.2022 в 11:28 Rius вне форума
  6. Старый комментарий
    Аватар для _lunar_
    Цитата:
    long
    Целый тип long имеет размер 8 байт (64 бита).
    это что за бред?
    long (как и int) является 4-х байтовым.
    8-ми байтовый тип это long long или __int64

    https://docs.microsoft.com/en-... w=msvc-170
    Запись от _lunar_ размещена 13.01.2022 в 12:38 _lunar_ вне форума
    Обновил(-а) _lunar_ 13.01.2022 в 12:47
  7. Старый комментарий
    Аватар для Rius
    _lunar_, не как int, помимо вашего vc++ есть и другие компиляторы и системы.
    Запись от Rius размещена 13.01.2022 в 12:58 Rius вне форума
  8. Старый комментарий
    Аватар для Алексей1153
    _lunar_ это от разрядности приложения зависит (и от хотелок разработчика компилятора)
    https://onlinegdb.com/RN7ZR266L
    Запись от Алексей1153 размещена 13.01.2022 в 12:59 Алексей1153 на форуме
  9. Старый комментарий
    Аватар для _lunar_
    Цитата:
    Сообщение от Алексей1153 Просмотреть комментарий
    это от разрядности приложения зависит
    причём тут разрядность?
    long что в x32, что в x64 является 4-х байтовым.
    есть макросы LONG LONG32 LONG64 и LONGLONG
    они все определены от int и long long

    Не по теме:

    какой-то там онлайн компиль, написанный не пойми кем, меня вообще не интересует.

    Запись от _lunar_ размещена 13.01.2022 в 14:02 _lunar_ вне форума
    Обновил(-а) _lunar_ 13.01.2022 в 14:05
  10. Старый комментарий
    Аватар для _lunar_
    Цитата:
    Сообщение от Rius Просмотреть комментарий
    _lunar_, не как int, помимо вашего vc++ есть и другие компиляторы и системы.
    ну напишите хуint, от этого что-то изменится?
    кто-нить вообще соображает про регистры процессора?
    или у всех в голове как там какой-то хрен в спецификациях обозначил какой-то там тип.
    Запись от _lunar_ размещена 13.01.2022 в 14:07 _lunar_ вне форума
  11. Старый комментарий
    Аватар для Rius
    А то изменится, что и int может оказаться 2-байтовым, и long 8-байтовым. Всё зависит от конкретного компилятора.
    Запись от Rius размещена 13.01.2022 в 14:21 Rius вне форума
  12. Старый комментарий
    Аватар для Алексей1153
    _lunar_, при чём тут какие-то регистры каких-то процессоров? Речь идёт про язык C++

    sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)

    а конкретные размеры разработчик компилятора может выставить свои
    Запись от Алексей1153 размещена 13.01.2022 в 14:22 Алексей1153 на форуме
  13. Старый комментарий
    Аватар для _lunar_
    Цитата:
    Сообщение от Rius Просмотреть комментарий
    А то изменится, что и int может оказаться 2-байтовым, и long 8-байтовым.
    я ещё раз говорю - какая разница как написать имя типа?
    есть общепринятые типы, и нормальный системный программист, увидев тип long сразу будет знать, что это 4 байта.
    видимо прикладным программистам этого не понять, поэтому дальнейший разговор абсолютно бессмысленный, особенно про регистры - это facepalm.
    Запись от _lunar_ размещена 13.01.2022 в 14:24 _lunar_ вне форума
    Обновил(-а) _lunar_ 13.01.2022 в 14:25
  14. Старый комментарий
    Аватар для Rius
    Цитата:
    и нормальный системный программист, увидев тип long сразу будет знать, что это 4 байта.
    Такое "знать" может только новичок, либо сидящий на одном-единственном компиляторе и другими не интересующийся.
    А язык, между прочим, кроссплатформенный.
    Если не ясно - тема о размере типа не у дефолт-компилятора дефолт-программистов из дефолт-сити, разрабатывающих дефолт-код для дефолт-области под дефолт-систему.
    Запись от Rius размещена 13.01.2022 в 14:28 Rius вне форума
    Обновил(-а) Rius 13.01.2022 в 17:46
  15. Старый комментарий
    Ну ребята, я не знаю, кто прав. Или это в компиляторе проблема или просто неправильные знания. я написал такой код в среде MS VS (2019):
    C++
    1
    2
    3
    4
    
    int main() {
        cout << sizeof(long) << endl;   //4
        cout << sizeof(long int) << endl;   //4
    }
    если у кого выводится другое, прошу поделиться, чтобы я знал исправлять ли что-либо в моем сообщении)))

    P.S. еще вопрос long и long int – то же самое??
    Запись от Vleo размещена 13.01.2022 в 15:09 Vleo вне форума
  16. Старый комментарий
    Аватар для Rius
    Vleo,
    берёте код
    C++
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    #include <iostream>
    using namespace std;
     
    int main (void)
    {
      cout << sizeof (int) << endl;
      cout << sizeof (long) << endl;
      cout << sizeof (long int) << endl;
      return 0;
    }
    идёте на https://godbolt.org
    выбираете компилятор x86-64 gcc 11.2
    в меню шестерёнки включаете execute the code, а внизу кнопку output для открытия окна вывода
    в параметрах компилятора ставите -m32 или -m64
    Цитата:
    The -m32 option sets int, long, and pointer types to 32 bits, and generates code that runs on any i386 system.
    The -m64 option sets int to 32 bits and long and pointer types to 64 bits, and generates code for the x86-64 architecture.
    и наблюдаете
    Цитата:
    Program returned: 0
    4
    4
    4
    либо
    Цитата:
    Program returned: 0
    4
    8
    8
    Цитата:
    чтобы я знал исправлять ли что-либо в моем сообщении)))
    Тут почитайте страшную правду о размерах: Вся правда о целочисленных типах в C
    Запись от Rius размещена 13.01.2022 в 15:50 Rius вне форума
    Обновил(-а) Rius 13.01.2022 в 15:56
  17. Старый комментарий
    Rius, Большое спасибо!)
    Запись от Vleo размещена 13.01.2022 в 16:00 Vleo вне форума
  18. Старый комментарий
    Аватар для Rius
    Цитата:
    еще вопрос long и long int – то же самое??
    long и long int - одно и то же, см. https://en.cppreference.com/w/cpp/language/types
    А вот char, signed char, unsigned char, как ни странно, - разные типы.
    Запись от Rius размещена 13.01.2022 в 16:07 Rius вне форума
  19. Старый комментарий
    Аватар для Croessmah
    Цитата:
    есть общепринятые типы, и нормальный системный программист, увидев тип long сразу будет знать, что это 4 байта.
    видимо прикладным программистам этого не понять, поэтому дальнейший разговор абсолютно бессмысленный, особенно про регистры - это facepalm.
    https://wandbox.org/permlink/7fiVASU13Vf5TPZH
    упс...
    видимо, нормальным системным программистам не понятно, что существуют стандарты, другие платформы, компиляторы и т.д., а не только Windows и CL.

    Цитата:
    какой-то там онлайн компиль, написанный не пойми кем, меня вообще не интересует.
    По ссылке непонятный компиль. написанный непойми кем один из лучших компиляторов - clang, но можете и другие потыкать.
    То что обычно называют онлайн-компилятор - это просто веб-морда к компилятору. Хотя откуда это знать нормальным системным программистам...
    Запись от Croessmah размещена 14.01.2022 в 09:01 Croessmah на форуме
    Обновил(-а) Croessmah 14.01.2022 в 09:11
  20. Старый комментарий
    Аватар для Croessmah
    Цитата:
    Сообщение от wer1 Просмотреть комментарий
    А что дают беззнаковые типы переменных?
    Отсутствие UB при "переполнении", более предсказуемые результаты при сдвигах и т.д., возможность запихнуть большее число в меньшее количество бит. И дело не в экономии байт, а, например, в том что эти данные в бинарном протоколе и под число отводится определенное количество бит.
    Цитата:
    Точнее говоря (а я решил много тысяч задач), беззнаковый тип переменных мне никогда не потребовался.
    У меня очень часто используется.


    Цитата:
    Целый тип char занимает в памяти 1 байт (8 бит)
    Это не совсем верно. Да, char занимает один байт, но вот байт не обязан быть именно 8-ми битным.
    На текущий момент существуют архитектуры в которых байт равен, например, 16 бит.
    На той же самой архитектуре int может быть 16 бит, т.е. равен одному байту, тогда (sizeof(char) == sizeof(int)).
    Можете посмотреть сюда: https://eel.is/c++draft/basic.... undamental
    Это хоть какая-то гарантия, но я не могу точно сказать, всегда ли они соблюдаются на текущий момент.
    Запись от Croessmah размещена 14.01.2022 в 10:43 Croessmah на форуме
    Обновил(-а) Croessmah 14.01.2022 в 11:05
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru