Який діапазон значень можуть зберігати цілочисельні типи в C ++


86

Може 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?

Відповіді:


139

У мінімальних діапазонах ви можете покластися на це:

  • short intта int: -32,767 до 32,767
  • unsigned short intі unsigned int: від 0 до 65 535
  • long intВід -2,147,483,647 до 2,147,483,647
  • unsigned 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,807
  • unsigned long long int: Від 0 до 18 446 744 073 709 551 615

Отже, цей тип буде досить великим (знову ж таки, якщо у вас він є).


Примітка для тих, хто вважає, що я допустив помилку з цими нижчими межами - я цього не зробив. Вимоги C для діапазонів написані для забезпечення цілих подань доповнення або знакової величини, де найменше представлене значення і найвище представлене значення відрізняються лише за знаком. Також дозволено мати представлення доповнення двох, де значення зі знаковим бітом 1 та всіма бітами значення 0 є поданням, а не юридичним значенням. Іншими словами, intце НЕ потрібно , щоб мати можливість представляти значення 32768.


Спочатку в назві було написано "C / C ++".
кафе

чому довгий довгий int позитивний діапазон == негативний діапазон
Мохамед Абдалла

1
@mohamedabdallah: Див. останній абзац відповіді: діапазони стандартних С - це спосіб, який дозволяє подавати доповнення або знакову величину.
кафе

Ага..Я зрозумів, що це intозначає long int.
mazend

32

Розмір числових типів не визначений стандартом С ++, хоча мінімальні розміри є. Спосіб визначити, якого розміру вони мають на вашій платформі, - це використовувати числові обмеження

Наприклад, максимальне значення для 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-бітовій настільній машині.


Мінімальні розміри для цілочисельного типу передбачені відповідними стандартами (хоча точні розміри не є).
кафе

13

Щоб з’ясувати обмеження у вашій системі:

#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.


9

Інші люди тут розміщуватимуть посилання на розміри даних, точність і т.д.
Я збираюся розповісти вам, як це зрозуміти самостійно.
Напишіть невеликий додаток, який зробить наступне.

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: Цей підхід не буде працювати для чисел із плаваючою комою (тобто подвійних чи плаваючих).

Сподіваюся, це допомагає


1
Якщо ви спробуєте це з підписаними ints, ви отримаєте від’ємні числа. Прочитайте "комплімент двох" (посилання надано), і для них легко отримати повний спектр (позитивний і негативний). en.wikipedia.org/wiki/Twos_Compliment
Binary Worrier

8

У C ++ тепер int та інші дані зберігаються за допомогою компліментного методу 2. Це означає, що діапазон:

-2147483648 to 2147483647

або від -2 ^ 31 до 2 ^ 31-1

1 біт зарезервований для 0, тому позитивне значення - це менше, ніж 2 ^ (31)


4

Ви можете використовувати функції 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;
}

Результатом буде: Обмеження типів даних:

  • char: від -128 до 127
  • беззнаковий знак: від 0 до 255
  • короткий: -32768 до 32767
  • короткий без підпису: від 0 до 65535
  • int: -2147483648 до 2147483647
  • без підпису int: від 0 до 4294967295
  • довгий: -2147483648 до 2147483647
  • без підпису long: від 0 до 4294967295
  • довгий довгий: від -9223372036854775808 до 9223372036854775807
  • без підпису long long: від 0 до 18446744073709551615
  • float: 1.17549e-038 до 3.40282e + 038
  • подвійний: 2.22507e-308 до 1.79769e + 308
  • довгий подвійний: 3.3621e-4932 до 1.18973e + 4932

2

Для непідписаного типу даних немає знакового біта, і всі біти призначені для даних; тоді як для підписаного типу даних 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]


1

Може не підписаний long int містити десятизначне число (1 000 000 000 - 9 999 999 999) на 32-розрядному комп'ютері.

Немає



Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.