Quelle est la différence entre «int» et «uint» / «long» et «ulong»?

118

Je connais intet long(nombres 32 bits et 64 bits), mais que sont uintet ulong?

Moteur de différence
la source

Réponses:

224

Les types de données primitifs préfixés par «u» sont des versions non signées avec les mêmes tailles de bits. En effet, cela signifie qu'ils ne peuvent pas stocker de nombres négatifs, mais d'un autre côté, ils peuvent stocker des nombres positifs deux fois plus grands que leurs homologues signés. Les contreparties signées n'ont pas de préfixe "u".

Les limites pour int (32 bits) sont:

int: 2147483648 to 2147483647 
uint: 0 to 4294967295 

Et pour longtemps (64 bits):

long: -9223372036854775808 to 9223372036854775807
ulong: 0 to 18446744073709551615
Isak Savo
la source
12
C'est assez amusant à travailler à la main. Une variable signée 32 bits utilise 1 bit pour le signe (positif ou négatif) et peut donc stocker des valeurs comprises entre -2 ^ 31 et + 2 ^
31-1
quand on compare int et uint pour l'usage, lequel est faisable?
Arun Prasad
Quel est l'équivalent C ++?
darkgaze
@JacoPretorius C'est faux. 8 bits int a une plage de –128 à 127. Le 9ème bit représente 256. Ainsi, avec 8 bits, vous pouvez représenter toutes les valeurs jusqu'à 255 (9ème val - 1). La plage de -128 à 127 a une longueur d'exactement 255. Il n'y a donc pas de bit qui contienne le signe. Toutes les valeurs jusqu'à 127 sont positives. Les valeurs ci-dessus s'affichent négativement. 255 serait -1. 254 serait -2 et donc dans un sens jusqu'à 128.
C4d
Je pense qu'il vaut également la peine de noter que spécifiquement pour int vs uint, l'entier non signé n'est pas conforme CLS, et il est recommandé d'utiliser int aussi souvent que possible.
db2
38

uintet ulongsont les versions non signées de intet long. Cela signifie qu'ils ne peuvent pas être négatifs. Au lieu de cela, ils ont une valeur maximale plus élevée.

Type Min Max Conforme CLS
int -2.147.483.648 2.147.483.647 Oui
uint 0 4 294 967 295 Non
long –9,223,372,036,854,775,808 9,223,372,036,854,775,807 Oui
ulong 0 18,446,744,073,709,551,615 Non

Pour écrire un entier non signé littéral dans votre code source, vous pouvez utiliser le suffixe uou Upar exemple 123U.

Vous ne devez pas utiliser uint et ulong dans votre interface publique si vous souhaitez être conforme CLS .

Lisez la documentation pour plus d'informations:

À propos, il y a aussi short et ushort et byte et sbyte .

Mark Byers
la source
C'est intéressant - que voulez-vous dire à propos de la conformité CLS? Le lien va à la documentation MSDN pour int. Si par "CLS" vous entendez la spécification du langage C # alors je ne comprends pas - la spécification décrit clairement à la fois uint et ulong (section 1.3)
Isak Savo
1
@Isak Savo: Il est important d'être compatible CLS si vous écrivez une interface qui pourrait être utilisée par d'autres langages .NET que C #.
Mark Byers
Curieux que vous mentionniez court et ushort mais laissez de côté byte et sbyte :)
Roman Starkov
10

usignifie unsigned, ainsi ulongest un grand nombre sans signe. Vous pouvez stocker une valeur ulongsupérieure à long, mais aucun nombre négatif n'est autorisé.

Une longvaleur est stockée en 64 bits, avec son premier chiffre pour indiquer s'il s'agit d'un nombre positif / négatif. tandis que ulongest également 64 bits, avec tous les 64 bits pour stocker le numéro. donc le maximum de ulong est 2 (64) -1, tandis que long est 2 (63) -1.

Cheng Chen
la source
9

La différence est que les types de données uintet ulongsont non signés, ce qui signifie que la plage est différente: ils n'acceptent pas les valeurs négatives:

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
la source