Когда соучредитель вашей школы менее чем за 15 минут объясняет вам, как решить сложную задачу из учебной программы, в которой у вас мало опыта или знаний по этому вопросу, он просит вас написать сообщение в блоге о Вы с радостью соглашаетесь, как ОС машины находит максимальные и минимальные значения для целочисленного типа данных.
Чтобы ответить на вопрос, во-первых, мы должны понять, какие типы данных существуют на используемом вами компьютерном языке (C для этого примера), выяснить, сколько байтов находится в каждом типе данных, а затем выяснить, было ли приложение создано для 32 -битный или 64-битный процессор.
TL;DR
На картинке выше есть уравнение, которое вы можете использовать в своей программе на языке C. Я расшифровал куриную царапину на картинке выше в уравнение, которое вы можете использовать ниже. Вы также можете скомпилировать и запустить этот файл, чтобы узнать размеры типов данных на 32-битном или 64-битном процессоре.
Беззнаковые типы данных:
int max = pow(2, number of bits assigned to data type) — 1;
Подписанные типы данных:
int min = (pow(2, number of bits assigned to data type) / 2) * -1;
int max = (pow(2, number of bits assigned to data type) / 2) — 1;
Разъяснил:
Какие типы данных существуют в языке C?
В GeeksforGeeks есть отличная статья обо всех типах данных на языке C. Не вдаваясь в архитектуру создания языка C, можно сказать, что каждому типу данных присвоены диапазоны значений. Читая картинку ниже, вы можете распознать закономерность.
Слова int
и char
могут выделяться вместе со словами signed
и unsigned
. Слово int
- это сокращение от целого числа, а char
- от символа. При присвоении целочисленных значений типам данных в C существуют диапазоны значений, используемые в компьютерном языке C. short int
, который имеет два байта памяти, имеет минимальный диапазон значений -32,768
и максимальный диапазон значений 32,767
. unsigned short int
, беззнаковое значение, не имеющее отрицательного знака (-), имеет минимальный диапазон 0
и максимальный диапазон 65,535
.
Целочисленные типы данных просто выражаются как целые числа в определенном диапазоне с использованием приведенного выше уравнения. char
типы данных, с другой стороны, представляют собой символьные представления чисел, ссылающихся на таблицу ASCII. Взгляните на изображение таблицы ASCII выше. ASCII расшифровывается как Американский стандартный код обмена информацией. Компьютеры производят вычисления с числами, поэтому код ASCII - это числовое представление символа, такого как символ a, x или !.
Когда вы объявляете переменную в своей программе, например
char first_initial = 'N';
вы назначаете целочисленное значение 78 таблицы ASCII вместо буквы 'N'
переменной first_initial
. Компьютер усваивает его как десятичное целое число 78 с основанием 10, которое затем выводится на терминал как символьное значение заглавной буквы N
с помощью функции типа putchar(78)
. Как разработчик программного обеспечения, вы должны принимать осознанные решения о том, какие типы данных вы хотите назначить в своем приложении, в зависимости от их использования памяти и типов проблем, которые вы пытаетесь решить.
Сколько укусов в каждом типе данных?
Если вы снова обратитесь к таблице GeeksforGeeks, язык C имеет предопределенное количество слотов памяти (байтов), назначенных каждому типу данных. В языке C в 1 байте 8 бит. Почему на языке C 8 бит были назначены на 1 байт?
Вернемся к нашему присвоению заглавной буквы 'N'
нашей переменной. Когда мы назначаем 'N'
типу данных char
, мы назначаем 1 байт памяти переменной first_initial.
.
char
- это 1 байт в C, потому что это указано в стандартах. Это связано с тем, что двоичное представление типа данных char
может уместиться на основе 1 байта. Во время первичной разработки C
наиболее общедоступными стандартами символов были ASCII
и EBCDIC
, которые требовали 7- и 8-битного кодирования. 1 байт был достаточным для представления всего набора символов.
«Что такое двоичное представление char
типа данных?», - спросите вы.
Двоичное представление - это система счисления с основанием 2, которая использует два взаимоисключающих состояния для представления информации. Двоичное представление - это набор чисел, предназначенный для понимания компьютерами.
Что представляет собой это двоичное число в десятичной системе счисления?
0000 0110
Ответ шесть. Как я пришел к такому выводу? Думайте о каждом числовом значении, представленном как бит. В приведенной выше числовой последовательности восемь числовых значений, 0 или 1, что означает восемь битов. Начиная с самой дальней цифры справа, мы считаем влево, используя уравнение:
2 ^ 0
, который равен 2 в 0-й степени.
Второе число будет 2 в 1-й степени, а затем 2 во 2-й степени, пока мы не получим самое левое число, которое будет равно 2 в 7-й степени. Ниже приведен простой дисплей, который показывает десятичное представление для каждой позиции двоичного числа.
128 64 32 16
8 4 2 1
0 0 0 0
0 1 1 0
Опять же, глядя на двоичное представление, мы можем использовать только значение 1 или 0, представляющее присутствующее или отсутствующее, потому что двоичное является взаимоисключающим. Если у нас есть 1 в значении, мы добавляем его к общей сумме, которую хотим представить в десятичной системе счисления. В нашем примере мы видим, что у нас есть 1 во втором десятичном представлении и еще 1 в третьем десятичном представлении. Мы получаем 6 от сложения 2+ 4.
Еще одно полезное числовое представление для компьютеров - это шестнадцатеричное представление. Шестнадцатеричное представление - это еще один шаблон чисел, который представляет значение цвета для компьютера с использованием определенного шаблона нумерации, такого как # FF5733, который имеет оранжевый цвет.
Итак, каким будет десятичное представление:
0110 0111
or 0011 1111
?
Связывая все вместе
Как получить максимальные и минимальные значения для целочисленных типов данных в зависимости от операционной системы на C? Используйте приведенное ниже уравнение.
Беззнаковые типы данных:
int max = pow(2, number of bits assigned to data types) — 1;
Подписанные типы данных:
int min = (pow(2, number of bits assigned to data types) / 2) * -1;
int max = (pow(2, number of bits assigned to data types) / 2) — 1;
Давайте использовать тип данных unsigned short int
с максимальным диапазоном 65,535
. Мы можем найти это двумя способами. Самый простой способ - использовать приведенное выше уравнение. Чтобы найти максимальное значение для беззнакового целочисленного типа данных, мы возьмем 2 в степени 16 и вычтем на 1, что составит 65,535
. Мы получаем число 16, беря количество байтов, присвоенных типу данных unsigned short int
(2), и умножаем его на количество бит, назначенных каждому байту (8), и получаем 16.
Другой способ узнать максимальное значение для типа данных unsigned short int
в C - использовать двоичное представление. Мы знаем, что тип данных unsigned short int
из приведенного выше примера состоит из 16 бит. Если мы поместим это в двоичное представление базы 2, это будет выглядеть примерно так.
1111 1111 1111 1111
В десятичной системе счисления это будет (1 + 2 + 4 + 8) + (16 + 32 + 64 + 128) + (256 + 512 + 1024 + 2048) + (4096 + 8192 + 16384 + 32768), что равно 65,535
.
То, как мы представляем signed short int
, отличается от того, как мы представляем unsigned short int
. Мы должны принять во внимание, что unsigned short int
s - это только положительные числа. При использовании двоичного представления для положительных чисел каждый бит, равный 1, добавляется к представлению десятичного значения.
Когда мы хотим использовать signed
типы данных с использованием двоичного представления, если первый бит равен 0, число положительное, а если первый бит равен 1, число отрицательное, но мы подсчитываем числа по-другому.
Мы считаем отрицательные числа иначе. Вместо того, чтобы начинать со всех 0 и считать 1, мы начинаем со всех 1 и считаем 0, начиная с -1. Взгляните на этот signed short int
пример выше:
1000 0000 0000 0000
В приведенном выше примере -1 + -32,767
, это -32,768
в десятичной системе счисления и является минимальным значением для типов данных signed short int
. Опять же, отрицательные значения для подписанных типов данных начинаются со всех единиц и считаются нулями. Посмотрите на пример ниже.
1111 1111 1111 1100
В приведенном выше примере -4 в десятичной системе счисления. Теперь вы знаете, как найти максимальное и минимальное значения в двоичной системе счисления значений беззнаковых и подписанных типов данных.
32-битные против 64-битных процессоров
Производители компьютерных процессоров используют две принципиально разные архитектуры: 32-битную и 64-битную. Если вы хотите узнать больше о применимых различиях между ними, прочтите эту статью Джона Мартиндейла.
«Число битов в процессоре относится к размеру типов данных, которые он обрабатывает, и к размеру его реестра. Проще говоря, 64-битный процессор более эффективен, чем 32-битный процессор, потому что он может обрабатывать больше данных одновременно. 64-битный процессор способен хранить больше вычислительных значений, включая адреса памяти, что означает, что он может получить доступ к более чем в четыре миллиарда раз большему объему физической памяти, чем 32-битный процессор. Это так же здорово, как кажется. 64-битные процессоры для 32-битных процессоров то же самое, что автомобиль для телеги ».
В зависимости от того, в какой ОС вы запускаете свою программу, язык C назначает разные байты разным типам данных. Скомпилируйте и запустите исполняемый файл из этого файла. Он распечатает что-то вроде этого:
Это показывает, что существуют разные назначения байтов для типов данных, которые выполняются на 32-битных процессорах и 64-битных процессорах.
Если у вас есть какие-либо вопросы или комментарии, не стесняйтесь добавлять их ниже. Вы можете следить за мной в твиттере @ NTTL_LTTN. Спасибо за ваше время.