Может ли unsigned long int
удерживать десятизначный номер (1,000,000,000 - 9,999,999,999) на 32-битном компьютере?
Кроме того, каковы диапазоны unsigned long int
, long int
, unsigned int
, short int
, short unsigned int
и int
?
Может ли unsigned long int
удерживать десятизначный номер (1,000,000,000 - 9,999,999,999) на 32-битном компьютере?
Кроме того, каковы диапазоны unsigned long int
, long int
, unsigned int
, short int
, short unsigned int
и int
?
Минимальными диапазонами, на которые вы можете положиться, являются:
short int
и int
: -32,767 до 32,767unsigned short int
и unsigned int
: от 0 до 65535long int
: -2,147,483,647 до 2,147,483,647unsigned long int
: от 0 до 4 294 967 295Это означает, что no, long int
не может полагаться на сохранение 10-значного числа. Однако более крупный тип long long int
был введен для C в C99 и С++ в С++ 11 (этот тип также часто поддерживается как расширение компиляторами, созданными для более старых стандартов, которые его не включают). Минимальный диапазон для этого типа, если ваш компилятор поддерживает его, составляет:
long long int
: -9,223,372,036,854,775,807 до 9,223,372,036,854,775,807unsigned long long int
: от 0 до 18 446 744 073 709 551 615Таким образом, этот тип будет достаточно большим (опять же, если у вас есть это).
Заметка для тех, кто считает, что я допустил ошибку с этими нижними границами - я этого не сделал. Требования C для диапазонов записываются так, чтобы их можно было комбинировать с целыми числами или знаками, где наименьшее представимое значение и наивысшее представляемое значение отличаются только знаком. Также разрешено иметь представление с двумя дополнениями, где значение со знаком-битом 1 и всеми битами значения 0 является представлением ловушки, а не юридическим значением. Другими словами, int
не требуется для представления значения -32,768.
Размер числовых типов не определен в стандарте С++, хотя минимальные размеры. Способ узнать, какой размер они находятся на вашей платформе, заключается в использовании числовых ограничений
Например, максимальное значение для int может быть найдено:
std::numeric_limits<int>::max();
Компьютеры не работают в базе 10, а это означает, что максимальное значение будет иметь вид 2 n -1 из-за того, как цифры представляют в памяти. Возьмем, например, восемь бит (1 байт)
0100 1000
Самый правый бит (число), когда он установлен в 1, представляет 2 0 следующий бит 2 1 затем 2 2 и так до тех пор, пока мы не дойдем до самого левого бита, который, если число без знака, представляет 2 7.
Итак, число представляет 2 6 + 2 3= 64 + 8 = 72, потому что установлены 4-й бит справа и 7-й бит вправо слева.
Если мы установим все значения в 1:
11111111
Теперь число (предполагается без знака)
128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 = 2 8 - 1
И, как мы видим, это самое большое возможное значение, которое может быть представлено 8 битами.
На моей машине и int и длинные одинаковы, каждый из них может удерживать между -2 31 до 2 31 - 1. По моему опыту наиболее распространенный размер на современном 32-битном настольном компьютере.
Другие люди здесь будут размещать ссылки на data_sizes и precisions и т.д.
Я расскажу вам, как это понять.
Напишите небольшое приложение, которое будет делать следующее.
unsigned int ui;
std::cout << sizeof(ui));
это будет (в зависимости от компилятора и архивирования) печатать 2, 4 или 8, говоря 2 байта длиной, 4 байта и т.д.
Предположим, что это 4.
Теперь вы хотите сохранить максимальное значение 4 байта, максимальное значение для одного байта (в шестнадцатеричном формате) 0xFF. Максимальное значение четырех байтов - 0x, за которым следует 8 f (одна пара f для каждого байта, 0x сообщает компилятору, что следующая строка - это шестнадцатеричный номер). Теперь измените свою программу, чтобы присвоить это значение и распечатать результат
unsigned int ui = 0xFFFFFFFF;
std::cout << ui;
Это максимальное значение, которое может содержать unsigned int, показанное в представлении базы 10.
Теперь сделайте это для long's, shorts и любого другого значения INTEGER, которое вам интересно.
NB: этот подход не будет работать для чисел с плавающей запятой (т.е. double или float).
Надеюсь, что это поможет
Чтобы узнать пределы вашей системы:
#include <iostream>
#include <limits>
int main(int, char **) {
std::cout
<< static_cast< int >(std::numeric_limits< char >::max()) << "\n"
<< static_cast< int >(std::numeric_limits< unsigned char >::max()) << "\n"
<< std::numeric_limits< short >::max() << "\n"
<< std::numeric_limits< unsigned short >::max() << "\n"
<< std::numeric_limits< int >::max() << "\n"
<< std::numeric_limits< unsigned int >::max() << "\n"
<< std::numeric_limits< long >::max() << "\n"
<< std::numeric_limits< unsigned long >::max() << "\n"
<< std::numeric_limits< long long >::max() << "\n"
<< std::numeric_limits< unsigned long long >::max() << "\n";
}
Обратите внимание, что long long
является только законным в C99 и С++ 11.
В С++ теперь int и другие данные сохраняются с использованием метода 2 комплиментов. Это означает, что диапазон:
-2147483648 to 2147483647
или -2 ^ 31 до 2 ^ 31-1
1 бит зарезервирован для 0, поэтому положительное значение равно меньше 2 ^ (31)
Для неподписанных типов данных нет знакового бита, и все биты для данных ; тогда как для подписанного типа данных MSB указывается знаковый бит, а остальные бит - для данных.
Чтобы найти диапазон, выполните следующие действия:
Шаг: 1 → Вывести no из байтов для типа данных предоставления.
Шаг: 2 → Применить следующие вычисления.
Let n = no of bits in data type
For signed data type ::
Lower Range = -(2^(n-1))
Upper Range = (2^(n-1)) - 1)
For unsigned data type ::
Lower Range = 0
Upper Range = (2^(n)) - 1
Например,
Для unsigned int size = 4 байта (32 бит) → Диапазон [0, (2 ^ (32)) - 1]
Для подписанного int size = 4 байта (32 бит) → Диапазон [- (2 ^ (32-1)), (2 ^ (32-1)) - 1]
Нет, только часть десятизначного числа может быть сохранена в unsigned long int, действительный диапазон которого составляет от 0 до 4 294 967 295. вы можете обратиться к этому: http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.80).aspx
Может ли unsigned long int удерживать десятизначный номер (1,000,000,000 - 9,999,999,999) на 32-разрядном компьютере.
Нет
Вы должны посмотреть на специализации шаблона numeric_limits < > для данного типа. Его в заголовке.