В чем разница между «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
srodriguez
источник
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, когда вам просто нужно быстрое целое число и не заботитесь о диапазоне (кроме подписанного / беззнакового).

Дж. Гвиннер
источник