Типы char, short, int и long
Целый тип 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.
char ch= 12 ;
short sh=- 5000 ;
int in= 2445777 ;
Так как беззнаковые целые типы не предназначены для хранения отрицательных значений, то попытка установить отрицательное значение может привести к неожиданным последствиям. Вот такой невинный скрипт приведет к бесконечному циклу:
//— бесконечный цикл
void OnStart ()
<
uchar u_ch;
for ( char ch=-128;ch <128;ch++)
<
u_ch=ch;
Print ( «ch = » ,ch, » u_ch = » ,u_ch);
>
>
Правильно будет так:
//— правильный вариант
void OnStart ()
<
uchar u_ch;
for ( char ch=-128;ch <=127;ch++)
<
u_ch=ch;
Print ( «ch = » ,ch, » u_ch = » ,u_ch);
if (ch==127) break ;
>
>
ch= -128 u_ch= 128
ch= -127 u_ch= 129
ch= -126 u_ch= 130
ch= -125 u_ch= 131
ch= -124 u_ch= 132
ch= -123 u_ch= 133
ch= -122 u_ch= 134
ch= -121 u_ch= 135
ch= -120 u_ch= 136
ch= -119 u_ch= 137
ch= -118 u_ch= 138
ch= -117 u_ch= 139
ch= -116 u_ch= 140
ch= -115 u_ch= 141
ch= -114 u_ch= 142
ch= -113 u_ch= 143
ch= -112 u_ch= 144
ch= -111 u_ch= 145
.
//— отрицательные значения нельзя хранить в беззнаковых типах
uchar u_ch=-120;
ushort u_sh=-5000;
uint u_in=-401280;
Шестнадцатеричные: цифры 0-9, буквы а-f или А-F для значений 10-15; начинаются с 0х или 0Х.
0x0A , 0x12 , 0X12 , 0x2f , 0xA3 , 0Xa3 , 0X7C7
Сколько памяти занимает указатель

Сколько памяти занимает объединение union
Помогите пожалуйста разобраться. Сколько памяти занимает объединение union Z < int a; float b;.
Как узнать, сколько байтов памяти занимает массив
Я за Си сижу уже.. полчаса.. встала задача: узнать количество памяти, который занимает массив.

Может ли указатель занимать не столько же памяти, сколько int
Ребят, подскажите, могут вообще быть случаи, когда указатель занимает не столько же памяти, сколько.
Dev C ++ занимает больше памяти чем турбо си
Почему на dev C ++ занимает больше памяти чем турбо си? или однаково? 64 розрядна на dev c++
213 / 202 / 85
Регистрация: 09.05.2012
Сообщений: 494
зависит от архитектуры ос. и соответсвенно в 32х розрядных он занимает 4 байта,а в 64 розрядных ос 8 байт.
хотя, я могу ошибатся.
Добавлено через 1 минуту
зы: sizeof()
Регистрация: 31.01.2013
Сообщений: 16
Указатель занимает ровно столько сколько занимает тип данных на который он ссылается.
А сколько занимает тип данных зависит уже от архитектуры и прочего.
Псевдослучайный
1946 / 1145 / 98
Регистрация: 13.09.2011
Сообщений: 3,215
Сообщение от ivanui 
Указатель занимает ровно столько сколько занимает тип данных на который он ссылается.
Да? В таком случае может объясните нам, почему же тогда объемные структуры выгодней передавать по указателю, а не по значению, если размер одинаковый-то?
Сколько весит булевая переменная в си подобных языках?
Она ведь 4 байта весит? Но зачем 4 байта для значения true or false? Там и бита хватит. Тогда следующий вопрос, как можно в обычной переменной изменить значение третьего бита или получить его значение? Какие функции? C++.
- Вопрос задан более трёх лет назад
- 2528 просмотров
1 комментарий
Оценить 1 комментарий
Решения вопроса 1
«I’m here to consult you» © Dogbert
как можно в обычной переменной изменить значение третьего бита или получить его значение
int v = 8; int v3 = (v >> 3) & 1; // получил значение третьего бита (0/1) v ^= (1
Ответ написан более трёх лет назад
Нравится 1 10 комментариев
Urukhayy @Urukhayy Автор вопроса
Что в Вашей записи означает 1
> Что в Вашей записи означает 1 << 3
1 сдвинутая влево на 3. Вы основы С/С++-то знаете?
<>
> Что будет работать быстрей, куча булевых переменных, или одна переменная, и использование её битов?
Вам надо будет очень постараться чтобы заметить разницу в скорости.
Используйте тот подход, который делает код понятнее.
куча булевых переменных будет быстрее
DancingOnWater @DancingOnWater
int v3 = v & (1 << 3);
Уверен? По идее получим все-те же 8.<>
@DancingOnWater: ну да, 8. Хочется единицу -- можно сдвинуть результат вправо. Но зачем? В плане истинности ничего не изменится.
> куча булевых переменных будет быстрее
@CAMOKPYT: как мне нравятся такие безапеляционные утверждения, вы бы знали. Почему быстрее? Когда быстрее?
DancingOnWater @DancingOnWater
@jcmvbkbc: нен-не, с этим никто не спорит. Но ведь комментарий "получил значение третьего бита", когда это не так.
@DancingOnWater: ну даже не знаю. Поправил ответ, чтобы не смущать никого (:
Urukhayy @Urukhayy Автор вопроса
Эм. а, если использовать код, который был до вашей правки.. Можно было его заменить на: int v3 = v & (3). Так ведь?
> Можно было его заменить на: int v3 = v & (3). Так ведь?
Нет, не так. На v & 8, в лучшем случае.
Ответы на вопрос 3
DancingOnWater @DancingOnWater
Побитовые операции смотреть.
А еще битовые поля.
Вот так, к примеру, можно получить третий бит (написал из головы, за полную корректность не отвечаю)
uint x = 10; int value = (x & 0x8) >>2;
P.S. А 4 весит из-за того, что все типы в Си пляшут от 4-битового char. Но никто не мешает объявить структуру шириной в 1 бит, но тогда самому придется встретиться с выравниванием.
Ответ написан более трёх лет назад
Комментировать
Нравится 1 Комментировать
brutal_lobster @brutal_lobster
Загляните в стандарт по с++, например: 5.3.3 Sizeof
The result of sizeof applied to any other fundamental type (3.9.1) is
implementation-defined. [ Note: in particular, sizeof(bool), sizeof(char16_t), sizeof(char32_t), and
sizeof(wchar_t) are implementation-defined
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Не знаю как правильно называется, но.
codepad.org/zUOeXQBj
#include struct __attribute__ ((__packed__)) A < unsigned flag0 : 1; unsigned flag1 : 2; unsigned flag2 : 2; unsigned flag3 : 3; >; int main() < A a = ; printf("%d\n", sizeof(bool)); // 1 printf("%d\n", sizeof(A)); // 1 printf("%u %u %u %u\n", a.flag0, a.flag1, a.flag2, a.flag3); // 1 0 2 7 return 0; >
Ответ написан более трёх лет назад
Комментировать
Нравится Комментировать
Ваш ответ на вопрос
Войдите, чтобы написать ответ

- C
- +1 ещё
Почему мой пин постоянно 1?
- 1 подписчик
- вчера
- 135 просмотров
Сколько места в памяти занимает указатель в C++?
Искал информацию по данному вопросу, но не находил однозначного ответа. Кто-то говорит, что все зависит от разрядности операционной системы: если система x64, то выделяется 8 байт, если же x86, то 4. Другие утверждают, что указатель занимает столько же памяти, сколько и та переменная, на которую указывает указатель. То есть если у меня есть строковая переменная типа string, которая занимает 28 байт, то, если я создам указатель на эту переменную, то и он займет 28 байт? Или же 4(8)? Где представлена верная информация?
Отслеживать
задан 5 окт 2016 в 21:44
Yaroslav Zinchenko Yaroslav Zinchenko
189 1 1 золотой знак 3 3 серебряных знака 10 10 бронзовых знаков
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Размер указателя зависит от настроек компилятора в момент компиляции программы. Больше ни от чего. Как вы скажете компилятору - так и будет. Никакого отношения к OS или hardware, на которых производится компиляция программы, размер указателя не имеет. Настройки компилятора определяют все параметры целевой платформы, для которой будет выполнена компиляция, в том числе и размер указателя.
В современных "массовых" целевых платформах используется так называемая плоская модель памяти с указателями размера 32 или 64 бита (4 или 8 байтов). Во времена DOS/Win16, когда подлежащая аппаратура использовала сегментную адресацию памяти, компиляторы С++ поддерживали целый зоопарк разнообразных моделей памяти (tiny, small, large, compact, standard, huge и т.д.) в каждой из которых мог быть свой размер указателя. Если компиляция производится для какой-то более экзотической целевой платформы (embedded etc.), то и размер указателя может быть совсем другим.
В языке С++ также есть свои особые типы "указателей", такие как указатели-на-члены-класса. Эти типы обычно обладают своей особой внутренней структурой и их размер обычно превосходит размер обычного указателя.