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

Char, short, int, long: какой тип выбрать?

25.09.2015, 00:06. Показов 6194. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет

Читая книги по C++ столкнулся с тем, что везде пишут примерно одно и тоже. Допустим про char, short, int, long пишут что типо лучше всего использовать тип int. И приводят доводы что это так сказать золотая середина между всеми этими типами.

Но вот допустим если я знаю, что у меня в программе будут использоваться числа не превосходящие число 100. Зачем мне попросту тратить память указывая тип int(4 байта), когда вместо этого я бы мог обойтись типом short(2 байт).

Итого если у меня в программе предположим используется 10 типов int - это займет 40 байт. А если использовать short то всего лишь 20 байт. Разница на мой взгляд есть.


Так вот хотелось бы услышать ваше мнение по этому поводу, стоит ли использовать short или все же лучше пользоваться int и не заморачиваться.
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
25.09.2015, 00:06
Ответы с готовыми решениями:

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

Создать объединение, что содержит элементы типов char int short fload long string
всем доброго времени суток! мне нужно создать объединение, что содержит элементы типов char int short fload long string. создать массив...

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

10
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
25.09.2015, 00:13
Цитата Сообщение от dicros Посмотреть сообщение
лучше всего использовать тип int
Если именно так пишут в книгах, книгу закрыть и уничтожить.

Поначалу лучше всего, вначале обучения, но не действительно лучше.
До той поры, пока не придет осознание, что в этот вот тип вмещается столько-то байт, а больше мне и не надо, имеет смысл использовать int (unsigned int).

А в short вообще-то не обязательно 2 байта.
2
2444 / 1842 / 406
Регистрация: 15.12.2013
Сообщений: 8,243
25.09.2015, 00:21
Цитата Сообщение от dicros Посмотреть сообщение
Зачем мне попросту тратить память указывая тип int(4 байта), когда вместо этого я бы мог обойтись типом short(2 байт).
размер таких типов может различаться. Но вы можете использовать типы с фиксированной длинной:
http://www.cplusplus.com/reference/cstdint/
1
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
25.09.2015, 00:23  [ТС]
Цитата Сообщение от daslex Посмотреть сообщение
А в short вообще-то не обязательно 2 байта.
видимо я чего-то не знаю потому что везде пишут что это 2 байта, а вот int уже имеет зависимость.

Цитата Сообщение от daslex Посмотреть сообщение
До той поры, пока не придет осознание, что в этот вот тип вмещается столько-то байт, а больше мне и не надо
Ну а если допустим еще меньше взять тип char(хоть и пишут что он больше используется для символов) это же не означает что его не льзя использовать с числами. Или это уже перебор будет
0
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.09.2015, 00:32
Лучший ответ Сообщение было отмечено DrOffset как решение

Решение

Цитата Сообщение от dicros Посмотреть сообщение
Зачем мне попросту тратить память
рассмотрим пример:

http://rextester.com/LOM90476

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
 
struct sample1
{
    int   value1;
    short value2;
};
struct sample2
{
    int value1;
    int value2;
};
 
int main()
{
    std::cout<<"size of sample1 = "<< sizeof(sample1)<<'\n';
    std::cout<<"size of sample2 = "<< sizeof(sample2)<<'\n';
}
как видите, размер структур одинаковый,
и использование short не сэкономило вам память.

другой пример:
http://rextester.com/FKWTN73961

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
using namespace std;
 
int main()
{
    std::cout << "Hello, world!\n";
    
    typedef decltype(short() + short()) sum;
    
    if( is_same<sum, int>::value == 1 )
        cout<<"decltype( short()+short() ) is int"<<endl;
    
    short v1 = 0;
    short v2 = 0;
    
    if( is_same<decltype(v1 +v2), int>::value == 1 )
        cout<<"decltype( v1+v2 ) is int"<<endl;
    
    auto v3 = v1+v2;
    
    if( is_same<decltype(v3), int>::value == 1 )
        cout<<"decltype( v3 ) is int"<<endl;
}
здесь мы видим, что результат сложения двух short имеет тип int

возникает вопрос:
почему компилятор стремится выровнять данные по границе int?

это связанно с оптимизацией вычислений по разрядной сетке машины.

int - это тип данных, который лучше всего обрабатывается на данной платформе.

поэтому, что бы оптимизировать различные вычисления,
компилятор стремится выравнивать данные в структурах по его границе
(здесь есть нюансы,
например double выравнивается по границе двойного машинного слова,
но не суть)

цемес в том, что используя short вы действительно можете сэкономить память,
но только если хорошо понимание что делаете.

однако в большинстве случаев либо сэкономить вообще не получится.
либо вы сэкономите копейки, ценой потери быстродействия.

Добавлено через 2 минуты
Цитата Сообщение от dicros Посмотреть сообщение
видимо я чего-то не знаю потому что везде пишут что это 2 байта
вы чего то не знаете.

стандарт гарантирует:
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long).
однако фактические размеры типов (за искл char) - могут плавать.
http://en.cppreference.com/w/cpp/language/types
4
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
25.09.2015, 00:43  [ТС]
hoggy, т.е лучше не заморачиваться да
0
1373 / 596 / 199
Регистрация: 02.08.2011
Сообщений: 2,886
25.09.2015, 01:05
dicros, вообще имеет смысл заморачиваться. Надо понимать что нет панацеи от всех болезней и иногда выгодно одно, а иногда другое.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
#pragma pack(push, 1)
 
struct sample1
{
    long long int   value1;
    short value2;
};
 
struct sample2
{
    int   value1;
    short value2;
};
 
struct sample3
{
    int   value1;
    int value2;
};
 
int main()
{
    std::cout<<"(long long int) + (short)  = "<< sizeof(sample1)<<'\n';
    std::cout<<"(int) + (short) = "<< sizeof(sample2)<<'\n';
    std::cout<<"(int) + (int) = "<< sizeof(sample3)<<'\n';
}
1
Эксперт С++
 Аватар для hoggy
8973 / 4319 / 960
Регистрация: 15.11.2014
Сообщений: 9,760
25.09.2015, 01:23
Цитата Сообщение от dicros Посмотреть сообщение
т.е лучше не заморачиваться да
если есть возможность не заморачиваться - лучше не заморачиваться.
1
183 / 181 / 66
Регистрация: 15.02.2015
Сообщений: 515
25.09.2015, 10:31
Важно не хранить указатели ни в одном из этих типов (например int и long), что сгубило многие x86 приложения (библиотеки) при переходе на x64. Для подобных случаем есть, как уже заметили про cstdint, тип "intptr_t" и "uintptr_t".
2
Evg
Эксперт CАвтор FAQ
 Аватар для Evg
21281 / 8305 / 637
Регистрация: 30.03.2009
Сообщений: 22,660
Записей в блоге: 30
25.09.2015, 16:50
Помимо того, что переменная занимает память, ещё играет роль и скорость вычислений. Размер типа int обычно устроен таким образом, что в аппаратуре есть операции, которые умеют работать с типом такого размера. Более того, если выполнять арифметические операции над короткими типами (char и short), то по стандарту сначала операнды преобразуются к типу int, затем выполняется операция в терминах int'а, а затем результат обратно преобразуется. Во многих случаях эти преобразования успешно схлопываются оптимизациями, но не всегда

C
char a, b, c, d;
void foo (void)
{
  a = (a * b) / (c * d);
}
При запуске 32-битного gcc с опцией -O2 получаю код:

Code
        movsbl  a, %eax
        movsbl  b, %edx
        movsbl  c, %ecx
        imull   %edx, %eax
        movsbl  d, %edx
        imull   %edx, %ecx
        cltd
        idivl   %ecx
        movb    %al, a
        ret
Теперь заменяем char на int и получим более быстрый код

Code
        movl    a, %eax
        imull   b, %eax
        movl    c, %ecx
        imull   d, %ecx
        cltd
        idivl   %ecx
        movl    %eax, a
        ret
Какая из всего этого сентенция? Если вы где-то краем уха слышали, что если писать так, то можно сэкономить три байта памяти, а если писать эдак, то можно сэкономить 3 микросекунды на исполнении, то не стОит придавать этому большое значение. Для начала просто научитесь программировать. Потом научитесь программировать хорошо. И только потом думайте о том, чтобы писать эффективный код (да и то только тогда, когда это реально нужно). В 99% случаев эффективный код получается за счёт правильного проектирования программы, а вовсе не за счёт точечных действий типа использования int'а вместо char'а, или использования сдвига на 3 вместо умножения на 8
1
 Аватар для dicros
1 / 1 / 0
Регистрация: 24.04.2014
Сообщений: 66
25.09.2015, 21:32  [ТС]
Всем спасибо за разъяснения, учту на будущее...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
25.09.2015, 21:32
Помогаю со студенческими работами здесь

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

Программа, которая выводит на экран значение функции sizeof от типов short, int, long и тд
Кого не затруднит, создайте новый проект. Определите размерность базовых типов в вашей системе. Для этого напишите программу, которая...

Преобразование 2-х char в один short int
Пробую преобразовать 2 char в один short int таким образом: char buf; short int skl; int kol=0; for(int...

записать по-битого один short int в два char
Здрасьте, всем. Записать побитого два char в один short int это: char char1; char char2; short int s; s=char1&lt;&lt;8|char2; ...

Двоичный дамп short и char выводится как int
Доброго дня! Пытаюсь выводить двоичный дамп переменных char, short и int вот таким образом: #include &lt;iostream&gt; using...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Работа со звуком через SDL3_mixer
8Observer8 08.02.2026
Содержание блога Пошагово создадим проект для загрузки звукового файла и воспроизведения звука с помощью библиотеки SDL3_mixer. Звук будет воспроизводиться по клику мышки по холсту на Desktop и по. . .
SDL3 для Web (WebAssembly): Основы отладки веб-приложений на SDL3 по USB и Wi-Fi, запущенных в браузере мобильных устройств
8Observer8 07.02.2026
Содержание блога Браузер Chrome имеет средства для отладки мобильных веб-приложений по USB. В этой пошаговой инструкции ограничимся работой с консолью. Вывод в консоль - это часть процесса. . .
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru