Junior
Каква е разликата между типовете uint и int в езика Go?
sobes.tech AI
Отговор от AI
Типовете uint и int в Go представляват цели числови типове данни, но се различават по диапазона на възможните стойности и по смисъла си (знакови/беззнакови).
int (знаков цял):
- Може да съхранява положителни, отрицателни числа и нула.
- Размерът в битове (и съответно диапазонът) зависи от архитектурата на компютъра (32 или 64 бита). На 32-битова архитектура това е 32 бита, а на 64-битова - 64 бита.
- Диапазон: от -2<sup>n-1</sup> до 2<sup>n-1</sup> - 1, където n е броят на битовете.
uint (беззнаков цял):
- Може да съхранява само неотрицателни числа, започващи от нула.
- Размерът в битове също зависи от архитектурата на компютъра (32 или 64 бита) и съответства на размера на
int. - Диапазон: от 0 до 2<sup>n</sup> - 1, където n е броят на битовете.
Основната разлика е, че int използва един бит за представяне на знака (положително или отрицателно число), докато uint използва всички битове за представяне на стойността на числото. Това дава възможност на uint да съхранява двойно по-голям максимален положителен диапазон в сравнение с int със същия размер.
При избор между int и uint трябва да се вземат предвид:
- Дали числото може да бъде отрицателно. Ако да, използвайте
int. - Необходим ли е максимален положителен диапазон. Ако да и отрицателните стойности не са нужни, може да е подходящ
uint. - Типът
uintчесто се използва за представяне на битови маски, идентификатори, размери или количества, които по своята природа не могат да бъдат отрицателни.
// int може да бъде отрицателен
var signedInt int = -10
// uint не може да бъде отрицателен
// var unsignedInt uint = -10 // Грешка при компилация
// Максимални стойности (на 64-битова система)
// fmt.Println(math.MaxInt64) // 9223372036854775807
// fmt.Println(math.MaxUint64) // 18446744073709551615 (приблизително двойно)
// Не е възможно неявно преобразуване между int и uint
var a int = 5
var b uint = 5
// if a == b { ... } // Грешка: несъвместимост на типове без явна преобразуване
// Явно преобразуване
var c int = 10
var d uint = uint(c)
var e uint = 20
var f int = int(e)