В чем разница между «int» и «uint» / «long» и «ulong»?


Ответы:


224

Примитивные типы данных с префиксом «u» представляют собой версии без знака с одинаковыми размерами бит. Фактически это означает, что они не могут хранить отрицательные числа, но, с другой стороны, они могут хранить положительные числа в два раза больше, чем их подписанные аналоги. Подписанные копии не имеют префикса «u».

Пределы для int (32 бит):

int: –2147483648 to 2147483647 
uint: 0 to 4294967295 

И надолго (64 бит):

long: -9223372036854775808 to 9223372036854775807
ulong: 0 to 18446744073709551615

12
Заниматься этим вручную довольно весело. 32-битная переменная со знаком использует 1 бит для знака (положительный или отрицательный), поэтому может хранить значения от -2 ^ 31 до + 2 ^ 31-1
— Жако Преториус

при сравнении int и uint для использования, какой из них возможен?
— Арун Прасад,

Что эквивалентно C ++?
— darkgaze

1
@JacoPretorius Это неправильно. 8-битное int имеет диапазон от –128 до 127. 9-й бит представляет 256. Таким образом, с 8-ю битами вы можете представить все значения до 255 (9-е значение - 1). Диапазон от -128 до 127 имеет длину ровно 255. Таким образом, нет бита, содержащего знак. Все значения до 127 положительны. Приведенные выше значения отображаются отрицательными. 255 будет -1. 254 было бы -2 и таким образом можно было бы уменьшить до 128.
— C4d

Я думаю, также стоит отметить, что специально для int vs uint целое число без знака не совместимо с CLS, и рекомендуется использовать int как можно чаще.
— db2

38

uintи ulongявляются неподписанными версиями intи long. Это означает, что они не могут быть отрицательными. Вместо этого они имеют большее максимальное значение.

Тип Мин. Макс. CLS
int -2 147 483 648 2 147 483 647 Да
uint 0 4,294,967,295 Нет
длинные –9,223,372,036,854,775,808 9,223,372,036,854,775,807 Да
ulong 0 18,446,744,073,709,551,615 Нет

Чтобы написать буквальное целое число без знака в исходном коде, вы можете использовать суффикс uили, Uнапример 123U.

Вам не следует использовать uint и ulong в общедоступном интерфейсе, если вы хотите быть CLS-совместимым .

Прочтите документацию для получения дополнительной информации:

Кстати, есть еще короткие и ushort и byte и sbyte .


Это интересно - что вы имеете в виду под совместимостью с CLS? Ссылка идет на документацию MSDN для int. Если под «CLS» вы имеете в виду спецификацию языка C #, тогда я не понимаю - спецификация четко описывает как uint, так и ulong (раздел 1.3)
— Исак Саво

1
@Isak Savo: важно быть CLS-совместимым, если вы пишете интерфейс, который может использоваться другими языками .NET, кроме C #.
— Марк Байерс,

Любопытно, что вы упоминаете short и ushort, но опускаете byte и sbyte :)
— Роман Старков

10

uозначает unsigned, что ulongэто большое число без знака. Вы можете хранить большее значение в ulongчем long, но никаких отрицательных чисел не допускается.

longЗначение сохраняется в 64-битном, с первой цифрой , чтобы показать , если это положительное / отрицательное число. в то время ulongкак тоже 64-битный, со всеми 64-битными для хранения числа. поэтому максимальное значение ulong равно 2 (64) -1, а long - 2 (63) -1.


9

Разница в том, что uintи ulongявляются типами данных без знака, что означает, что диапазон отличается: они не принимают отрицательные значения:

int range: -2,147,483,648 to 2,147,483,647
uint range: 0 to 4,294,967,295

long range: –9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
ulong range: 0 to 18,446,744,073,709,551,615

0

Прошло некоторое время с тех пор, как я C ++, но эти ответы немного ошибочны.

Что касается размера, int ничего не значит. Это условное значение стандартного целого числа; считается быстрым для таких вещей, как итерация. У него нет предустановленного размера.

Итак, ответы верны в отношении различий между int и uint, но неверны, когда они говорят о том, «насколько они велики» или каков их диапазон. Этот размер не определен, или, точнее, он будет меняться в зависимости от компилятора и платформы.

Никогда не вежливо обсуждать размер своих бит на публике.

Когда вы компилируете программу, int действительно имеет размер, поскольку вы взяли абстрактный C / C ++ и превратили его в конкретный машинный код.

Итак, СЕГОДНЯ, практически говоря с большинством распространенных компиляторов, они верны. Но не думайте об этом.

В частности: если вы пишете 32-битную программу, int будет одним, 64-битным, он может быть другим, а 16-битный - другим. Я прошел все три и бегло посмотрел на 6502 дрожь

Краткий поиск в Google показывает это: https://www.tutorialspoint.com/cprogramming/c_data_types.htm Это тоже хорошая информация: https://docs.oracle.com/cd/E19620-01/805-3024/lp64- 1 / index.html

используйте int, если вам действительно все равно, насколько велики ваши биты; это может измениться.

Используйте size_t и ssize_t, если хотите узнать, насколько большой объект.

Если вы читаете или записываете двоичные данные, не используйте int. Используйте ключевое слово (обычно зависящее от платформы / источника). WinSDK имеет множество хороших примеров этого, которые можно поддерживать. Другие платформы тоже.

Я потратил МНОГО времени на изучение кода людей, которые занимаются SMH, с мыслью, что все это чисто академично / педантично. Они съели людей, которые пишут неподдерживаемый код. Конечно, легко использовать тип int и использовать его без лишнего набора текста. Это большая работа, чтобы понять, что они на самом деле имели в виду, и немного ошеломляет.

Когда вы смешиваете int.

используйте int и uint, когда вам просто нужно быстрое целое число и не заботитесь о диапазоне (кроме подписанного / беззнакового).

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.