Почему int 4 байта
Перейти к содержимому

Почему int 4 байта

Типы 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

Почему char — 1 байт, а символьный литерал (‘A’) — 4?

Я понял, что то, что мы называем символами, на самом деле является числовым кодом, а потому символьным литералам выделяется столько же памяти, сколько и типу int (4 байта).
Но я не совсем понял, как в однобайтный char вмещается четырехбайтный символ?
И когда я объявляю char test = ‘A’; то сколько в компьютере выделилось памяти: 1 байт или 4?

(Если попробовать sizeof(test), то выйдет, что все таки 1. Но ведь ‘A’ — это 4 байта?)

  • Вопрос задан более двух лет назад
  • 838 просмотров

1 комментарий

Простой 1 комментарий

David Park , потому что типом ‘A’ является int .
Решения вопроса 1
Программист на «си с крестами» и не только

А теперь скажу правильный ответ.
В Си символьный литерал имеет тип int и потому его sizeof 4 байта.
В Си++ у него тип char и 1 байт. Потому те, кто создавал CPP-файл, проблемы не видели. Очевидно, связано с перегрузкой функций: как-то не хочется, чтобы в foo(‘A’) вызывалась версия для int.

#include int main() < int sz = sizeof('A'); // латинское printf("sz = %d\n", sz); return 0; >

При написании char test=’A’ на стеке будет 1 байт (+выравнивание). Здесь Си, грубо говоря, проводит преобразование типа — прямо при компиляции. Если написать char test=L’Й’ , сообщит, что преобразование при компиляции ushort→char обрежет результат с 1049 до 25.

Ответ написан более двух лет назад
Комментировать
Нравится 4 Комментировать
Ответы на вопрос 4
Saboteur @saboteur_kiev
software engineer

Я понял, что то, что мы называем символами, на самом деле является числовым кодом

Все в компьютере хранится в виде бит, сгруппированных по байтам.
Символ — абстракция для упрощения программирования, и есть различные таблицы кодировки для того, чтобы преобразовывать байты в символы при выводе на экран.
Количество байт, нужных на символ зависит собственно от кодировки.
В старых кодировках один байт означал один символ, в современных UTF, количество байт может быть разное (до 6 байт на символ в виде иероглифа).

а потому символьным литералам выделяется столько же памяти, сколько и типу int (4 байта).

Юзай typeid чтобы уточнить тип данных

Но я не совсем понял, как в однобайтный char вмещается четырехбайтный символ?

никак, это не char.
в С по дефолту char это однобайтный символ в ascII

И когда я объявляю char test = ‘A’; то сколько в компьютере выделилось памяти: 1 байт или 4?

Ты же сам указываешь тип при объявлении. Надо было привести код целиком.

(Если попробовать sizeof(test), то выйдет, что все таки 1. Но ведь ‘A’ — это 4 байта?)
‘A’ это значение, а не тип. Может быть это int?

Ответ написан более двух лет назад
Комментировать
Нравится 1 Комментировать
А нечего русские буквы в char запихивать

In (1), if c-char is not a numeric character sequence and is not representable as a single byte in the execution character set, the character literal is conditionally supported, has type int and implementation-defined value.

Ответ написан более двух лет назад
70-C9-4E-54-03-2F @Xproz Автор вопроса

char test = ‘Z’;
sizeof(test) = 1
sizeof(‘Z’) = 4

Вопрос, как в однойбайтовый char поместился четырехбайтовых ‘Z’ и сколько в итоге выделилось памяти после char test = ‘Z’, все еще остается открытым

David Park, ок, извините, тут C, а в нем, как ни странно, char литералы имеют тип int. Почему — а хрен его знает, так сложилось со времен К&Р (почитайте, например, тут, если хотите).
В плюсах такие литералы имеют тип char и размер 1 байт.

Вопрос, как в однойбайтовый char поместился четырехбайтовых ‘Z’ и сколько в итоге выделилось памяти после char test = ‘Z’,

сконвертится до байта. Ровно так же, как если бы вы написали char c = 1;
1 — имеет тип int, но это же не вызывает вопросов у вас?

GavriKos

#include #include //for 'typeid' to work using namespace std; int main ()

Как у вас 4 байта получилось?

Ответ написан более двух лет назад
70-C9-4E-54-03-2F @Xproz Автор вопроса

Не знаю, принципиально ли это здесь, но я писал на языке Си.
В книге (по Си) поясняется, что символьный литерал хранится в виде числового кода, поэтому для него выделяется 4 байта (столько же выделяется и для int).
Дальше поясняется, что под char — выделяется 1 байт.
Но как именно в char залез символ, под который выделяется 4 байта, я не понял.
sizeof(‘Y’) = 4 байт
char y = ‘Y’
sizeof(y) = 1 байт

GavriKos

#include #include #include #include #define typename(x) _Generic((x), /* Get the name of a type */ \ \ _Bool: "_Bool", unsigned char: "unsigned char", \ char: "char", signed char: "signed char", \ short int: "short int", unsigned short int: "unsigned short int", \ int: "int", unsigned int: "unsigned int", \ long int: "long int", unsigned long int: "unsigned long int", \ long long int: "long long int", unsigned long long int: "unsigned long long int", \ float: "float", double: "double", \ long double: "long double", char *: "pointer to char", \ void *: "pointer to void", int *: "pointer to int", \ default: "other") #define fmt "%20s is '%s'\n" int main()

‘A’ — это int.
Видать для поддержки всякого не влазящего в чар

Почему sizeof(int) = 4 а sizeof(int*) = 8? [закрыт]

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

Закрыт 1 год назад .
Написал следующий код

#include #include int main()

Вывод следующий

Integer: 4 PtrInteger: 8 

Почему так? Почему PtrInteger не равен 4?
Отслеживать
задан 17 авг 2022 в 7:27

У вас же 64 битная система? Указатель это адрес, размер адреса = размеру слова в процессоре (и разрядности ОС). А вот значение int обычно (так повелось издревле) 4 байта или 32 разряда

17 авг 2022 в 7:34
Очевидно, что вы компилируете 64-х битный код. Т.е. указатель размером 64 бита. 64/8==8
17 авг 2022 в 7:34
Все указатели занимают 8 байт.
17 авг 2022 в 18:38

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

Потому что в указателе хранится код ячейки памяти, который в зависимости от разрядности системы занимает 32 или 64 бита, т.е. 4 или 8 байт соответственно, о чем вам и говорит sizeof . int же имеет диапазон в чисел от −2 147 483 648 до 2 147 483 647, что соответствует 2 32 вариантам чисел, которые можно вписать в него, а значит он должен занимать 32 бита, или же 4 байта.

Отслеживать
ответ дан 17 авг 2022 в 7:40
1,771 2 2 золотых знака 5 5 серебряных знаков 17 17 бронзовых знаков

С единственным дополнением: int же [обычно] занимает 32 бита, или 4 байта, а значит, имеет диапазон представления от . и до . Ни размер, ни диапазон int в стандарте не указаны, да и плясать надо не от диапазона, а от размера.

17 авг 2022 в 8:13

Не совсем от разрядности системы. Я могу запустить х32 приложение на х64 винде, и там будут 4-байтные указатели.

Почему числовые типы данных в C имеют такой размер?

Каждый программист, которому приходилось писать на C или C-подобных языках, наверняка сталкивался с тем, что размер переменных одного и того же типа на разных машинах может быть различным. Немного разобравшись в этом вопросе многие успокаивались, узнав, что, действительно, размер тех же указателей зависит от реализации компилятора и разрядности машины. Но почему? И почему именно столько байт занимает указатель в том или ином случае?

Ответ дает книга «Computer Science: A Programmer’s Perspective» за авторством Рендела Брайанта и Девида О’Халарона.

Компьютеры и компиляторы поддерживают различные типы для хранения данных — в частности, целых чисел и чисел с плавающей запятой. Каждый отдельный тип может отличаться от других, например, способом представления хранимой информации и объемом занимаемой памяти.

Язык программирования C поддерживает различные типы для хранения как целых чисел, так и чисел с плавающей запятой. Символьный тип char, обычно используемый для представления отдельного символа, может также хранить беззнаковые числа. Более распространенный для этих целей int образует целое семейство типов за счет возможных префиксов: short, long и long long — и все различных размеров. В таблице ниже указано, сколько байт занимает в памяти каждый тип в зависимости от разрядности системы.

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

На данный момент этот блок не поддерживается, но мы не забыли о нём! Наша команда уже занята его разработкой, он будет доступен в ближайшее время.

Та же ситуация и с указателями (char*): в системе для хранения адресов используется все то же одно машинное слово, размер которого зависит от разрядности.

Перевод пункта 2.1.3 «Data sizes» из книги «Computer Science: A Programmer’s Perspective»

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *