Може 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 до 65 535long int
Від -2,147,483,647 до 2,147,483,647unsigned long int
: Від 0 до 4 294 967 295Це означає, що ні, long int
не можна покладатися на збереження будь-якого 10-значного числа. Однак більший тип long long int
був введений в C в C99 та C ++ в C ++ 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
це НЕ потрібно , щоб мати можливість представляти значення 32768.
int
означає long int
.
Розмір числових типів не визначений стандартом С ++, хоча мінімальні розміри є. Спосіб визначити, якого розміру вони мають на вашій платформі, - це використовувати числові обмеження
Наприклад, максимальне значення для 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 та long однакові, кожна здатна вмістити від -2 31 до 2 31 - 1. На мій досвід, найпоширеніший розмір на сучасній 32-бітовій настільній машині.
Щоб з’ясувати обмеження у вашій системі:
#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 та у C ++ 11.
Інші люди тут розміщуватимуть посилання на розміри даних, точність і т.д.
Я збираюся розповісти вам, як це зрозуміти самостійно.
Напишіть невеликий додаток, який зробить наступне.
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;
Це максимальне значення, яке може містити непідписаний int, показано у поданні бази 10.
Тепер зробіть це для довгих, шортів та будь-якого іншого значення INTEGER, яке вам цікаво.
NB: Цей підхід не буде працювати для чисел із плаваючою комою (тобто подвійних чи плаваючих).
Сподіваюся, це допомагає
У C ++ тепер int та інші дані зберігаються за допомогою компліментного методу 2. Це означає, що діапазон:
-2147483648 to 2147483647
або від -2 ^ 31 до 2 ^ 31-1
1 біт зарезервований для 0, тому позитивне значення - це менше, ніж 2 ^ (31)
Ви можете використовувати функції numeric_limits<data_type>::min()
і, numeric_limits<data_type>::max()
присутні у limits
файлі заголовка, і знайти межі кожного типу даних.
#include <iostream>
#include <limits>
using namespace std;
int main()
{
cout<<"Limits of Data types:\n";
cout<<"char\t\t\t: "<<static_cast<int>(numeric_limits<char>::min())<<" to "<<static_cast<int>(numeric_limits<char>::max())<<endl;
cout<<"unsigned char\t\t: "<<static_cast<int>(numeric_limits<unsigned char>::min())<<" to "<<static_cast<int>(numeric_limits<unsigned char>::max())<<endl;
cout<<"short\t\t\t: "<<numeric_limits<short>::min()<<" to "<<numeric_limits<short>::max()<<endl;
cout<<"unsigned short\t\t: "<<numeric_limits<unsigned short>::min()<<" to "<<numeric_limits<unsigned short>::max()<<endl;
cout<<"int\t\t\t: "<<numeric_limits<int>::min()<<" to "<<numeric_limits<int>::max()<<endl;
cout<<"unsigned int\t\t: "<<numeric_limits<unsigned int>::min()<<" to "<<numeric_limits<unsigned int>::max()<<endl;
cout<<"long\t\t\t: "<<numeric_limits<long>::min()<<" to "<<numeric_limits<long>::max()<<endl;
cout<<"unsigned long\t\t: "<<numeric_limits<unsigned long>::min()<<" to "<<numeric_limits<unsigned long>::max()<<endl;
cout<<"long long\t\t: "<<numeric_limits<long long>::min()<<" to "<<numeric_limits<long long>::max()<<endl;
cout<<"unsiged long long\t: "<<numeric_limits<unsigned long long>::min()<<" to "<<numeric_limits<unsigned long long>::max()<<endl;
cout<<"float\t\t\t: "<<numeric_limits<float>::min()<<" to "<<numeric_limits<float>::max()<<endl;
cout<<"double\t\t\t: "<<numeric_limits<double>::min()<<" to "<<numeric_limits<double>::max()<<endl;
cout<<"long double\t\t: "<<numeric_limits<long double>::min()<<" to "<<numeric_limits<long double>::max()<<endl;
}
Результатом буде: Обмеження типів даних:
Для непідписаного типу даних немає знакового біта, і всі біти призначені для даних; тоді як для підписаного типу даних MSB вказується знаковий біт, а решта бітів - для даних.
Щоб знайти асортимент, виконайте такі дії:
Крок: 1 -> Дізнатися відсутність байт для типу даних give.
Крок: 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
Наприклад,
Для непідписаного розміру int = 4 байти (32 біти) -> Діапазон [0, (2 ^ (32)) - 1]
Для підписаного розміру int = 4 байти (32 біти) -> Діапазон [- (2 ^ (32-1)), (2 ^ (32-1)) - 1]
Ні, лише частина десятизначного числа може зберігатись у непідписаному long int, дійсний діапазон якого становить від 0 до 4 294 967 295. Ви можете звернутися до цього: http://msdn.microsoft.com/en-us/library/s3f49ktz(VS.80).aspx
Ви повинні переглянути спеціалізацію шаблону numeric_limits <> для даного типу. Це в заголовку.