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

Unsigned c что это

  • автор:

Диапазоны типов данных

32-разрядные и 64-разрядные компиляторы Microsoft C++ распознают типы в таблице далее в этой статье.

Если имя начинается с двух символов подчеркивания ( __ ), тип данных является нестандартным.

Диапазоны, представленные в следующей таблице, включают указанные значения.

Тип Имя Байт Другие имена Диапазон значений
int 4 signed От −2 147 483 648 до 2 147 483 647
unsigned int 4 unsigned От 0 до 4 294 967 295
__int8 1 char От -128 до 127
unsigned __int8 1 unsigned char От 0 до 255
__int16 2 short , short int , signed short int От −32 768 до 32 767
unsigned __int16 2 unsigned short , unsigned short int От 0 до 65 535
__int32 4 signed , signed int , int От −2 147 483 648 до 2 147 483 647
unsigned __int32 4 unsigned , unsigned int От 0 до 4 294 967 295
__int64 8 long long , signed long long От −9 223 372 036 854 775 808 до 9 223 372 036 854 775 807
unsigned __int64 8 unsigned long long От 0 до 18 446 744 073 709 551 615
bool 1 нет false или true
char 1 нет -128–127 по умолчанию

В зависимости от характера использования переменная типа __wchar_t обозначает расширенный символьный или многобайтовый символьный тип. Чтобы указать константу расширенного символьного типа, перед символьной или строковой константой следует использовать префикс L .

signed и unsigned — это модификаторы, которые можно использовать с любым целочисленным типом, кроме типа bool . Обратите внимание, что char , signed char и unsigned char — это три разных типа, предназначенных для механизмов, подобных перегрузке и шаблонам.

Размер типов int и unsigned int — 4 байта. Однако переносимый код не должен зависеть от размера int , поскольку языковой стандарт позволяет варьировать его в зависимости от реализации.

C и C++ в Visual Studio также поддерживают целочисленные типы с указанием размера. Дополнительные сведения см. в разделе __int8, __int16, __int32, __int64 и ограничения целых чисел.

Дополнительные сведения об ограничениях размеров каждого типа см. в разделе «Встроенные типы».

Диапазон перечисляемых типов зависит от контекста языка и указанных флажков компилятора. Дополнительные сведения см. в статьях Объявления перечислений C и Объявления перечислений C++.

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

Не понимаю разницу между signed / unsigned

Не понимаю разницу между signed и unsigned , читал много материала в интернете, но вот как-то не получается понять. Зачем используют в коде эти ключевые слова и что они дают? На одном из сайтов написано:

The term «unsigned» in computer programming indicates a variable that can hold only positive numbers.

Но ведь я могу сделать так:

unsigned int x = -100; 

И компилятор не выдаст ошибку, то есть беззнаковый всё таки может хранить отрицательное значение? Или я что-то упустил? Все объяснения в интернете уходит сразу в -127 to 127 и 0 to 256 , но это не дает мне понимания. Объясните, пожалуйста, русским языком.

Отслеживать
6,641 6 6 золотых знаков 30 30 серебряных знаков 52 52 бронзовых знака
задан 13 июл 2020 в 9:25
user290664 user290664
для gcc/clang есть ключик -Wconversion — который подобные случаи поймает и поругает.
13 июл 2020 в 9:38

3 ответа 3

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

TL; DR

Знаковые и беззнаковые типы имеют один и тот же размер, одни и те же требования выравнивания, а отличаются они в основном «смыслом» какого-то одного бита: у первых он означает знак числа, а у вторых — само значение.

unsigned int x = -100; 

Ошибку компилятор не выдает, потому что в C слабая типизация и -100 неявно конверируется в unsigned int .

Для начала приведу несколько выдержек из стандарта (следует читать по-порядку):

Существует пять стандартных знаковых целочисленных типа: signed char , short int , int , long int и long long int .

— ISO/IEC 9899:2017 § 6.2.5 / 4

Для каждого такого знакового типа существует соответствующий беззнаковый тип, что обозначается ключевым словом unsigned . Этот тип имеет тот же размер (включая информацию о знаке) и требования выравнивания.

— ISO/IEC 9899:2017 § 6.2.5 / 6

Для любого беззнакового типа (кроме unsigned char ), биты объектного представления делятся на две группы: значимые биты и padding-биты. Если в типе N значимых бит, то он должен быть способен представлять значения от 0 до 2 N − 1 в двоичной системе счисления.

— ISO/IEC 9899:2017 § 6.2.6.2 / 1

  • соответствующее значение с нулевым знаковым битом инвертируется (sign and magnitude);
  • знаковый бит имеет значение −(2 M ) (two’s complement);
  • знаковый бит имеет значение —(2 M − 1) (one’s complement).

Таким образом отличие знаковых типов от беззнаковых заключается, собственно, в бите знака: в первых он есть, а во вторых — нет.

И компилятор не выдаст ошибку, то есть беззнаковый всё таки может хранить отрицательное значение?

Нет, беззнаковое число не может хранить отрицательное значение, потому что в нем нет бита знака. А ошибку компилятор не выдает, потому что выполняется неявное преобразование -100 в тип unsigned int .

Мы можем присвоить вещественное число переменной типа int :

int a = 3.14; 

Но это ведь не значит, что переменные типа int могут хранить дробные значения?

Unsigned c что это

Основные типы в C++ подразделяются на две группы: целочисленные типы и типы с плавающей точкой (для краткости их будем называть плавающими типами). Это арифметические типы.

В C++ нет жёсткого стандарта на диапазоны значений арифметических типов (в стандарте языка оговариваются лишь минимально допустимые значения). В принципе, эти диапазоны определяются конкретной реализацией. Обычно выбор этих характеристик диктуется эффективностью использования вычислительных возможностей компьютера. Зависимость языка от реализации создаёт определённые проблемы переносимости. C++ остаётся машинно-зависимым языком.

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

char short int long

Имена целочисленных типов могут использоваться в сочетании с парой модификаторов типа:

signed unsigned

Эти модификаторы изменяют формат представления данных, но не влияют на размеры выделяемых областей памяти.

Модификатор типа signed указывает, что переменная может принимать как положительные, так и отрицательные значения. Возможно, что при этом самый левый бит области памяти, выделяемой для хранения значения, используется для представления знака. Если этот бит установлен в 0, то значение переменной считается положительным. Если бит установлен в 1, то значение переменной считается отрицательным.

Модификатор типа unsigned указывает, что переменная принимает неотрицательные значения. При этом самый левый бит области памяти, выделяемой для хранения значения, используется так же, как и все остальные биты области памяти — для представления значения.

В ряде случаев модификаторы типа можно рассматривать как имена основных типов.

Здесь также многое определяется конкретной реализацией. В версиях Borland C++ данные типов, обозначаемых как signed, short и int в памяти занимают одно и то же количество байтов.

Особое место среди множества основных целочисленных типов занимают перечисления, которые обозначаются ключевым словом enum. Перечисления представляют собой упорядоченные наборы целых значений. Они имеют своеобразный синтаксис и достаточно специфическую область использования. Их изучению будет посвящён специальный раздел.

Здесь также многое зависит от реализации. По крайней мере, для Borland C++ 4.5, основные характеристики целочисленных типов выглядят следующим образом:

Тип данных Байты Биты Min Max
signed char 1 8 — 128 127
unsigned char 1 8 0 255
signed short 2 16 -32768 32767
enum 2 16 -32768 32767
unsigned short 2 16 0 65535
signed int 2 16 -32768 32767
unsigned int 2 16 0 65535
signed long 4 32 -2147483648 2147483647
unsigned long 4 32 0 4294967295

К плавающим типам относятся три типа, представленные следующими именами типов, модификаторов и их сочетаний:

float double long double

Как и ранее, модификатор типа входит в число имён основных типов.

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

297.7 2.977*10**2 2.977E2

и ещё один пример…

0.002355 2.355*10**-3 2.355E-3

В научной нотации слева от символа E записывается мантисса, справа — значение экспоненты, которая всегда равняется показателю степени 10.

Для хранения значений плавающих типов в памяти используется специальный формат представления вещественных чисел. Этот формат называется IEEE форматом.

Ниже представлены основные характеристики типов данных с плавающей точкой (опять же для Borland C++ 4.5):

Тип данных Байты Биты Min Max
float 4 32 3.4E-38 3.4E+38
double 8 64 1.7E-308 1.7E+308
long double 10 80 3.4E-4932 3.4E+4932

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

char signed char unsigned char short signed short unsigned short signed unsigned short int signed short int unsigned short int int signed int unsigned int long signed long unsigned long long int signed long int unsigned long int

Все эти типы образуют множество целочисленных типов. К этому множеству также относятся перечисления.

А вот сочетания имён типов и модификаторов для представления чисел с плавающей точкой:

float double long double

Вот и всё об основных типах. Помимо основных типов в C++ существуют специальные языковые средства, которые позволяют из элементов основных типов создавать новые, так называемые производные типы.

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

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