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

Я знаю о int и long (32-битные и 64-битные числа), но что такое uint и ulong?


person Difference Engine    schedule 16.09.2010    source источник


Ответы (5)


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

Ограничения для int (32 бита):

int: –2147483648 to 2147483647 
uint: 0 to 4294967295 

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

long: -9223372036854775808 to 9223372036854775807
ulong: 0 to 18446744073709551615
person Isak Savo    schedule 16.09.2010
comment
Это довольно интересно делать своими руками. 32-битная переменная со знаком использует 1 бит для знака (положительного или отрицательного), поэтому может хранить значения от -2 ^ 31 до +2 ^ 31 - 1. - person Jaco Pretorius; 16.09.2010
comment
при сравнении int и uint для использования, какой из них возможен? - person Arun Prasad; 26.05.2016
comment
Что такое эквивалент С++? - person Darkgaze; 18.01.2018
comment
@JacoPretorius Это неправильно. 8-битное целое имеет диапазон от –128 до 127. 9-й бит представляет 256. Таким образом, с помощью 8-битного числа вы можете представить все значения до 255 (9-е значение — 1). Диапазон от -128 до 127 имеет длину ровно 255. Таким образом, нет ни одного бита, содержащего знак. Все значения до 127 положительны. Значения выше отображаются отрицательными. 255 будет -1. 254 будет -2 и так до 128. - person C4d; 19.12.2018
comment
Я думаю, также стоит отметить, что конкретно для int vs uint целое число без знака не совместимо с CLS, и рекомендуется использовать int как можно чаще. - person db2; 12.04.2019

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

Type    Min                           Max                           CLS-compliant
int     -2,147,483,648                2,147,483,647                 Yes
uint    0                             4,294,967,295                 No
long    –9,223,372,036,854,775,808    9,223,372,036,854,775,807     Yes
ulong   0                             18,446,744,073,709,551,615    No

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

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

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

Кстати, есть еще short и ushort и byte и sbyte .

person Mark Byers    schedule 16.09.2010
comment
Это интересно - что вы имеете в виду под CLS-совместимостью? Ссылка ведет на документацию MSDN для int. Если под CLS вы имеете в виду спецификацию языка С#, то я не понимаю - спецификация четко описывает как uint, так и ulong (раздел 1.3) - person Isak Savo; 16.09.2010
comment
@Isak Savo: важно быть CLS-совместимым, если вы пишете интерфейс, который может использоваться другими языками .NET, кроме C#. - person Mark Byers; 16.09.2010
comment
Любопытно, что вы упомянули короткие и короткие, но не упомянули байт и сбайт :) - person Roman Starkov; 19.09.2010

Разница в том, что 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
person srodriguez    schedule 16.09.2010

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

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

person Cheng Chen    schedule 16.09.2010

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

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

person J. Gwinner    schedule 13.08.2020