Какой диапазон значений может целочисленное хранилище типов в C++

Так как Вы хотите случайный элемент, это будет также работать:

>>> import random
>>> s = set([1,2,3])
>>> random.sample(s, 1)
[2]

документация, кажется, не упоминает производительность random.sample. От действительно быстрого эмпирического теста с огромным списком и огромным набором, это, кажется, постоянное время для списка, но не для набора. Кроме того, повторение по набору не случайно; порядок не определен, но предсказуем:

>>> list(set(range(10))) == range(10)
True 

, Если бы случайность важна и Вам нужен набор элементов в постоянное время (большие наборы), я использовал бы random.sample и преобразовал бы в список сначала:

>>> lst = list(s) # once, O(len(s))?
...
>>> e = random.sample(lst, 1)[0] # constant time
73
задан sudo_coffee 16 October 2016 в 02:35
поделиться

7 ответов

Минимальные диапазоны, на которые вы можете положиться:

  • short int и int : от -32,767 до 32,767
  • без знака 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 - это , а не , необходимый для представления значения -32 768.

615

Так что этот тип будет достаточно большим (опять же, , если он у вас есть).


Примечание для тех, кто считает, что я ошибся с этими нижними границами - я не т. Требования C для диапазонов написаны так, чтобы обеспечить возможность представления целых чисел с дополнением до единиц или величиной знака, где наименьшее представимое значение и наибольшее представимое значение отличаются только знаком. Также разрешено иметь представление с дополнением до двух, где значение с битом знака 1 и всеми битами значения 0 является представлением прерывания , а не допустимым значением. Другими словами, int - это , а не , необходимый для представления значения -32 768.

615

Так что этот тип будет достаточно большим (опять же, , если он у вас есть).


Примечание для тех, кто считает, что я ошибся с этими нижними границами - я не т. Требования C для диапазонов написаны так, чтобы допускать целочисленные представления с дополнением единиц или знаковой величиной, где наименьшее представимое значение и наибольшее представимое значение отличаются только знаком. Также разрешено иметь представление с дополнением до двух, где значение с битом знака 1 и всеми битами значения 0 является представлением прерывания , а не допустимым значением. Другими словами, int - это , а не , необходимый для представления значения -32 768.

Я ошибся с этими нижними границами - я не сделал. Требования C для диапазонов написаны так, чтобы допускать целочисленные представления с дополнением единиц или знаковой величиной, где наименьшее представимое значение и наибольшее представимое значение отличаются только знаком. Также разрешено иметь представление с дополнением до двух, где значение с битом знака 1 и всеми битами значения 0 является представлением прерывания , а не допустимым значением. Другими словами, int - это , а не , необходимый для представления значения -32 768.

Я ошибся с этими нижними границами - я не сделал. Требования C для диапазонов написаны так, чтобы допускать целочисленные представления с дополнением единиц или знаковой величиной, где наименьшее представимое значение и наибольшее представимое значение отличаются только знаком. Также разрешено иметь представление с дополнением до двух, где значение с битом знака 1 и всеми битами значения 0 является представлением прерывания , а не допустимым значением. Другими словами, int - это , а не , необходимый для представления значения -32 768.

Также разрешено иметь представление с дополнением до двух, где значение с битом знака 1 и всеми битами значения 0 является представлением прерывания , а не допустимым значением. Другими словами, int - это , а не , необходимый для представления значения -32 768.

Также разрешено иметь представление с дополнением до двух, где значение с битом знака 1 и всеми битами значения 0 является представлением прерывания , а не допустимым значением. Другими словами, int - это , а не , необходимый для представления значения -32 768.

118
ответ дан 24 November 2019 в 12:14
поделиться

Размер числовых типов не определен в стандарте C ++, хотя минимальные размеры определены. Чтобы узнать, какой у них размер на вашей платформе, используйте числовые ограничения

Например, максимальное значение для 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, 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255 = 2 8 - 1
И, как мы видим, это максимально возможное значение, которое может быть представлено 8 битами.

На моей машине int и long одинаковы, каждый из них может удерживать от -2 31 до 2 31 - 1. По моему опыту, наиболее распространенный размер на современных 32-битный настольный компьютер.

29
ответ дан 24 November 2019 в 12:14
поделиться

Другие люди здесь будут публиковать ссылки на data_sizes, precision и т. Д.
Я расскажу, как разобраться самому.
Напишите небольшое приложение, которое будет делать следующее.

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.

Теперь сделайте это для длинных, коротких и любых других значений INTEGER, которые вам интересны. о.

NB: Этот подход не будет работать для чисел с плавающей запятой (например, double или float).

Надеюсь, это поможет

7
ответ дан 24 November 2019 в 12:14
поделиться

Для беззнакового типа данных знаковый бит отсутствует и все биты для данных ; тогда как для подписанного типа данных MSB указывается знаковый бит, а оставшиеся биты предназначены для данных.

Чтобы найти диапазон, выполните следующие действия:

Шаг: 1 -> Определите количество байтов для данного тип данных.

Шаг: 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 

Например,

Для размера целого числа без знака = 4 байта (32 бита) -> Диапазон [0, (2 ^ (32)) - 1 ]

Для подписанного int size = 4 байта (32 бита) -> Диапазон [- (2 ^ (32-1)), (2 ^ (32-1)) - 1]

2
ответ дан 24 November 2019 в 12:14
поделиться

Нет, только часть десятизначного числа может храниться в длинном int без знака, допустимый диапазон которого равен 0 на 4 294 967 295. вы можете сослаться на это: http://msdn.microsoft.com/en-us/library/s3f49ktz (VS.80) .aspx

1
ответ дан 24 November 2019 в 12:14
поделиться

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

Нет

0
ответ дан 24 November 2019 в 12:14
поделиться

Вы должны посмотреть на специализации шаблона numeric_limits <> для данного типа. Его в шапке.

0
ответ дан 24 November 2019 в 12:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: