Перейти к содержимому

Чем отличается int от uint

  • автор:

Arduino.ru

Тип данных unsigned int — беззнаковое целое число, также как и тип int (знаковое) занимает в памяти 2 байта. Но в отличие от int, тип unsigned int может хранить только положительные целые числа в диапазоне от 0 до 65535 (2^16)-1).

Отличие кроется в том как unsigned int использует старший бит, иногда называемый знаковый бит. Если старший бит равен 1, то для типа int компилятор Arduino считает, что это число отрицательное, а остальные 15 bit несут информацию о модуле целого числа в дополнительного кода представления числа, в то время как unsigned int использует все 16 бит для хранения модуля числа.

Пример
unsigned int ledPin = 13;
Синтаксис
unsigned int var = val;
  • var — имя переменной
  • val — присваиваемое значение
Замечание по использованию типа unsigned int

Когда переменная типа int в следствие арифметической операции достигает своего максимального значения, она «перескакивает» на самое минимальное значение и наоборот:

unsigned int x x = 0; x = x - 1; // x теперь равна 65535 x = x + 1; // x теперь 0

В чем разница между Int32 и UInt32?

В чем разница между Int32 и UInt32? Вопрос о том, для чего был создан UInt32? Когда я должен использовать UInt32 вместо Int32?

Отслеживать
задан 12 июн 2019 в 8:17
2,907 7 7 золотых знаков 44 44 серебряных знака 87 87 бронзовых знаков

1 ответ 1

Сортировка: Сброс на вариант по умолчанию

UInt32 не допускает отрицательных чисел. Вот пояснения MSDN:

Этот тип значений UInt32 представляет из себя целое 32-разрядное число без знака со значениями от 0 до 4 294 967 295 (2^32).

Integer 32 представляет из себя число в диапазоне -2 147 483 648 to 2 147 483 647, а Unsigned Integer 32 от 0 до 4 294 967 295.

Для большего понимания надо понимать что UInt32 это 32-разрядное целое число без знака, которое можно представить 2 ^ 32 числа (0-4 294 967 295). Однако для предоставления отрицательных чисел требуется «изъять» один бит из 32-х битов, для указания либо положительного либо отрицательного числа. Это оставляет вам 2 ^ 31 возможных чисел как в положительном диапазоне так и в отрицательном диапазоне. Диапазон 2 ^ 31 составляет от -2 147 483 648 до 2 147 483 647 (положительный диапазон также включает число 0, следовательно только 2 147 483 647 ) такой тип значений называется Int32.

На практике UInt32 число используется, там где значения не могут быть отрицательными, поскольку он предполагает больший диапазон. Также стит не забывать что преобразование (прямое) из UInt32 в Int32 невозможно, так как Int32 не может содержать диапазон UInt32, и на оборот.

Чем отличается int от uint

Все данные, которые хранятся в памяти, по сути представляют просто набор битов. И именно тип данных определяет, как будут интерпретироваться эти данные и какие операции с ними можно произодить. Язык Go является статически типизированным языком, то есть все используемые в программе данные имеют определенный тип.

Go имеет ряд встроенных типов данных, а также позволяет определять свои типы. Рассмотрим базовые встроенные типы данных, которые мы можем использовать.

Целочисленные типы

Ряд типов представляют целые числа:

  • int8 : представляет целое число от -128 до 127 и занимает в памяти 1 байт (8 бит)
  • int16 : представляет целое число от -32768 до 32767 и занимает в памяти 2 байта (16 бит)
  • int32 : представляет целое число от -2147483648 до 2147483647 и занимает 4 байта (32 бита)
  • int64 : представляет целое число от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 и занимает 8 байт (64 бита)
  • uint8 : представляет целое число от 0 до 255 и занимает 1 байт
  • uint16 : представляет целое число от 0 до 65535 и занимает 2 байта
  • uint32 : представляет целое число от 0 до 4294967295 и занимает 4 байта
  • uint64 : представляет целое число от 0 до 18 446 744 073 709 551 615 и занимает 8 байт
  • byte : синоним типа uint8 , представляет целое число от 0 до 255 и занимает 1 байт
  • rune : синоним типа int32 , представляет целое число от -2147483648 до 2147483647 и занимает 4 байта
  • int : представляет целое число со знаком, которое в зависимости о платформы может занимать либо 4 байта, либо 8 байт. То есть соответствовать либо int32, либо int64.
  • uint : представляет целое беззнаковое число только без знака, которое, аналогично типу int, в зависимости о платформы может занимать либо 4 байта, либо 8 байт. То есть соответствовать либо uint32, либо uint64.

Здесь несложно запомнить, что есть типы со знаком (то есть которые могут быть отрицательными) и есть безнаковые положительные типы, которые начинаются на префикс u (uint32). Ну и также есть byte — синоним для uint8 и rune — синоним для int32.

Стоит отметить типы int и uint. Они имеют наиболее эффективный размер для определенной платформы (32 или 64 бита). Это наиболее используемый тип для представления целых чисел в программе. Причем различные компиляторы могут предоставлять различный размер для этих типов даже для одной и той же платформы.

Примеры определения переменных, которые представляют целочисленные типы:

var a int8 = -1 var b uint8 = 2 var c byte = 3 // byte - синоним типа uint8 var d int16 = -4 var f uint16 = 5 var g int32 = -6 var h rune = -7 // rune - синоним типа int32 var j uint32 = 8 var k int64 = -9 var l uint64 = 10 var m int = 102 var n uint = 105

Числа с плавающей точкой

Для представления дробных чисел есть два типа:

  • float32 : представляет число с плавающей точкой от 1.4*10 -45 до 3.4*10 38 (для положительных). Занимает в памяти 4 байта (32 бита)
  • float64 : представляет число с плавающей точкой от 4.9*10 -324 до 1.8*10 308 (для положительных) и занимает 8 байт.

Тип float32 обеспечивает шесть десятичных цифр точности, в то время как точность, обеспечиваемая типом float64, составляет около 15 цифр

Примеры использования типов float32 и float64:

var f float32 = 18 var g float32 = 4.5 var d float64 = 0.23 var pi float64 = 3.14 var e float64 = 2.7

В качестве разделителя между целой и дробной частью применяется точка.

Комплексные числа

Существуют отдельные типы для представления комплексных чисел:

  • complex64 : комплексное число, где вещественная и мнимая части представляют числа float32
  • complex128 : комплексное число, где вещественная и мнимая части представляют числа float64
var f complex64 = 1+2i var g complex128 = 4+3i

Тип bool

Логический тип или тип bool может иметь одно из двух значений: true (истина) или false (ложь).

var isAlive bool = true var isEnabled bool = false

Строки

Строки представлены типом string . В Go строке соответствует строковый литерал — последовательность символов, заключенная в двойные кавычки:

var name string = "Том Сойер"

Кроме обычных символов строка может содержать специальные последовательности (управляющие последовательности), которые начинаются с обратного слеша \. Наиболее распространенные последовательности:

  • \n : переход на новую строку
  • \r : возврат каретки
  • \t : табуляция
  • \» : двойная кавычка внутри строк
  • \\ : обратный слеш

Значение по умолчанию

Если переменной не присвоено значение, то она имеет значение по умолчанию, которое определено для ее типа. Для числовых типов это число 0, для логического типа — false, для строк — «»(пустая строка).

Неявная типизация

При определении переменной мы можем опускать тип в том случае, если мы явно инициализируем переменную каким-нибудь значением:

var name = "Tom"

В этом случае компилятор на основании значения неявно выводит тип переменной. Если присваивается строка, то то соответственно переменная будет представлять тип string, если присваивается целое число, то переменная представляет тип int и т.д.

То же самое по сути происходит при кратком определении переменной, когда также явным образом не указывается тип данных:

name := "Tom"

При этом стоит учитывать, что если мы не указываем у переменной тип, то ей обязательно надо присвоить некоторое начальное значение. Объявление переменной одновременно без указания типа данных и начального значения будет ошибкой:

var name // ! Ошибка

Надо либо указать тип данных (в этом случае переменная будет иметь значение по умолчанию):

var name string

Либо указать начальное значение, на основании которого выводится тип данных:

var name = "Tom"

Либо и то, и другое одновременно:

var name string = "Tom"

Неявная типизация нескольких переменных:

var ( name = "Tom" age = 27 )
var name, age = "Tom", 27

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

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

int: –2147483648 to 2147483647 uint: 0 to 4294967295 

И для длинных (64 бит):

long: -9223372036854775808 to 9223372036854775807 ulong: 0 to 18446744073709551615 

Isak Savo 16 сен. 2010, в 07:10
Поделиться

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

Jaco Pretorius 16 сен. 2010, в 08:29
при сравнении int и uint для использования какой из них выполним?
Arun Prasad 26 май 2016, в 05:27
Что такое эквивалент C ++?
darkgaze 18 янв. 2018, в 17:40

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

C4d 19 дек. 2018, в 11:03

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

db2 12 апр. 2019, в 15:31
Показать ещё 3 комментария

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

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

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

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

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

Mark Byers 16 сен. 2010, в 07:23
Поделиться

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

Isak Savo 16 сен. 2010, в 10:58
@Isak Savo: Исправлена ссылка, спасибо за указание на ошибку.
Mark Byers 16 сен. 2010, в 11:04

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

Mark Byers 16 сен. 2010, в 11:24
Любопытно, что вы упоминаете короткий и ushort, но опустите байт и sbyte 🙂
Roman Starkov 19 сен. 2010, в 12:00
Показать ещё 2 комментария

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *