Когда соучредитель вашей школы менее чем за 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 ints - это только положительные числа. При использовании двоичного представления для положительных чисел каждый бит, равный 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. Спасибо за ваше время.