Пределы целых чисел в C и C++
Ограничения для целочисленных типов в C и C++ представлены в следующей таблице. Эти ограничения заданы в стандартном файле заголовка C . Стандартный файл заголовка C++ содержит , который включает в себя .
В Microsoft C также допускается объявление целочисленных переменных с указанием размера, которые относятся к целочисленным типам с размером 8, 16, 32 или 64 бит. Дополнительные сведения о них см. в статье Целочисленные типы с указанием размера.
Ограничения для целочисленных констант
| Константа | Значение | Значение |
|---|---|---|
| CHAR_BIT | Количество битов в наименьшей переменной, которая не является битовым полем. | 8 |
| SCHAR_MIN | Минимальное значение для переменной типа signed char . | –128 |
| SCHAR_MAX | Максимальное значение для переменной типа signed char . | 127 |
| UCHAR_MAX | Максимальное значение для переменной типа unsigned char . | 255 (0xff) |
| CHAR_MIN | Минимальное значение для переменной типа char . | –128 (или 0, если используется параметр /J) |
| CHAR_MAX | Максимальное значение для переменной типа char . | –127 (или 255, если используется параметр /J) |
| MB_LEN_MAX | Максимальное число байтов в многобайтовом символе. | 5 |
| SHRT_MIN | Минимальное значение для переменной типа short . | -32768 |
| SHRT_MAX | Максимальное значение для переменной типа short . | 32767 |
| USHRT_MAX | Максимальное значение для переменной типа unsigned short . | 65 535 (0xffff) |
| INT_MIN | Минимальное значение для переменной типа int . | -2147483647 — 1 |
| INT_MAX | Максимальное значение для переменной типа int . | 2147483647 |
| UINT_MAX | Максимальное значение для переменной типа unsigned int . | 4 294 967 295 (0xffffffff) |
| LONG_MIN | Минимальное значение для переменной типа long . | -2147483647 — 1 |
| LONG_MAX | Максимальное значение для переменной типа long . | 2147483647 |
| ULONG_MAX | Максимальное значение для переменной типа unsigned long . | 4 294 967 295 (0xffffffff) |
| LLONG_MIN | Минимальное значение для переменной типа long long . | –9 223 372 036 854 775 807 – 1 |
| LLONG_MAX | Максимальное значение для переменной типа long long . | 9 223 372 036 854 775 807 |
| ULLONG_MAX | Максимальное значение для переменной типа unsigned long long . | 18 446 744 073 709 551 615 (0xffffffffffffffff) |
Если значение превышает максимально возможное представление целочисленного типа, компилятор Microsoft выдает ошибку.
Завершение блока, относящегося только к системам Майкрософт
Использование INT_MAX и INT_MIN в C/C++
В этой статье мы рассмотрим использование INT_MAX и INT_MIN в C/C++.
На самом деле это полезные макросы, которые представляют максимальное и минимальное целочисленные значения.
Давайте посмотрим на это, используя несколько примеров.
Использование INT_MAX и INT_MIN
INT_MAX — это макрос, представляющий максимальное целочисленное значение. Точно так же INT_MIN представляет минимальное целочисленное значение.
#include INT_MAX INT_MIN
Обратите внимание, что любая целочисленная переменная должна находиться между INT_MIN и INT_MAX. Обычно целые числа хранятся в виде 4 байтов (32 бита). Это означает, что почти на всех машинах максимальное целочисленное значение будет 2^(31) — 1=+2147483647. Минимальное целочисленное значение будет -(2^31)=-2147483648. Давайте проверим это для нашей машины.
#include #include int main()
Maximum Integer Value: 2147483647 Minimum Integer Value: -2147483648
Действительно, мы получаем то, что предсказываем. Давайте теперь возьмем другой пример, чтобы правильно предсказать любое целочисленное переполнение или потерю значимости.
#include #include int main() < int value = 0; while (value >= 0) < // Check for overflow if (value == INT_MAX) < printf("value = %d. Possible overflow!\n", value); >value ++; > printf("Now, value = %d\n", value); value = 0; while (value value --; > printf("Now, value = %d\n", value); return 0; >
value = 2147483647. Possible overflow! Now, value = -2147483648 value = -2147483648. Possible underflow! Now, value = 2147483647
Хотя это занимает несколько секунд, это действительно делает то, что мы ожидаем. Целое число переполнится до INT_MIN и переполнится до INT_MAX . Это полезно для обнаружения таких скачков значений.
Зачем нужны эти макросы?
- Чтобы избавить вас от необходимости запоминать фактические значения.
- Используйте единые шаблоны программирования на всех компьютерах
- Очень удобно использовать
Надеюсь, эти причины могут убедить вас использовать макросы такого рода всякий раз, когда вы создаете свою собственную библиотеку C/C++.
Заключение
В этой статье мы узнали об использовании макросов INT_MAX и INT_MIN в C/C++.
Для получения аналогичного контента просмотрите наш раздел учебника по программированию на C.
Рекомендации
- страница cplusplus.com на climits
min(x,y)
Макрос max() возвращает наибольшее из двух значений, а макрос min() возвращает наименьшее из двух значений. Макросы max() и min() возвращают тот же тип результата, что и их аргументы. Оба аргумента макросов должны иметь один и тот же тип.
Следующая программа иллюстрирует использование макросов max ( ) и min ( ) :
#include
#include
int main ( void )
{
printf ( «max of 10, 20 is %d \n » , max ( 10 , 20 ) ) ;
printf ( «min of 10, 20 is %d \n » , min ( 10 , 20 ) ) ;
return 0 ;
}
Функции и указатели в C++
В языке С++ присутствует возможность использовать функции, то есть логичекские структурные единицы кода, которые позволяют сделать код более читаемым и разделить функционал.
myFunction.cpp
Синтаксис функций можно описать следующим образом:
тип_возвращаемого_значения название_функции(аргументы_функции) . код функции . >
Пример функции, возвращающей наибольшее число из двух:
int max(int x, int y) if (x > y) return x; else return y; >
Вызов функции выглядит следующим образом:
int a = 150; int b = 980; int c = max(a, b) // Функция вернет значение 980
Указатели
Попробуем реализовать функцию, которая принимает 3 integer переменных, сравнивает 2 из них и результат сравнения(наибольшее из чисел) записывает в третий аргумент.
madMax.cpp
Кажется логичным сделать подобную реализацию этой функции:
void max(int x, int y, int c) if (x > y) c = x; else c = y; >
Однако, мы можем убедиться в том, что следующий код, использующий нашу функцию сработает некорректно.
int a = 150; int b = 980; int c = 0; max(a, b, c) std::cout c; // Печатает 0 а не 980.
Что произошло? Все дело в том, что при вызове функции в ее аргументы были переданы всего лишь значения переменных a, b, c, которые равнялись соответственно 150, 980 и 0. Поэтому внутри функции были созданы переменные x, y, c в которых хранились эти значения, но эти переменные лежат совсем по другим адресам в оперативной памяти. Соответственно, изменение значений переменных внутри функций приводит к тому, что они изменяются не по тем адресам, в которых лежат переменные вызывающей стороны.
Указатели — это один из способов, позволяющих решить данную проблему. Идея заключается в том, чтобы передавать не значение переменной, а ее адрес в оперативной памяти, по которму можно определить и изменить значение.
Тогда с учетом этого, функция max() должна быть модифицирована следующим образом:
void max(int x, int y, int* c) if (x > y) *c = x; else *c = y; >
Где int* — это тип аргумента, означающий адрес на переменную типа integer. Оператр * позволяет обратиться по адресу данной переменной и считать или записать значение.
Как же теперь вызывать эту функцию?
int a = 150; int b = 980; int c = 0; max(a, b, &c) std::cout c; // Печатает 980
Теперь все заработало. Оператор & позволяет узнать адрес переменной и, например, как здесь, передать его в функцию, для того, чтобы та могла записать по нему новое значение.
Сайт построен с использованием Pelican. За основу оформления взята тема от Smashing Magazine. Исходные тексты программ, приведённые на этом сайте, распространяются под лицензией GPLv3, все остальные материалы сайта распространяются под лицензией CC-BY-SA.