Тип long: Тип данных Long — Visual Basic
Тип данных Long — Visual Basic
-
- Чтение занимает 2 мин
В этой статье
Содержит 64-битные (8-байтные) целые числа со знаком в диапазоне от-9223372036854775808 до 9 223 372 036 854 775 807 (1 – 7… E + 18).Holds signed 64-bit (8-byte) integers ranging in value from -9,223,372,036,854,775,808 through 9,223,372,036,854,775,807 (9.2…E+18).
КомментарииRemarks
Используйте Long
тип данных для хранения целочисленных чисел, которые слишком велики, чтобы вместить их в Integer
тип данных.Use the Long
data type to contain integer numbers that are too large to fit in the Integer
data type.
Значение по умолчанию для типа Long
— 0.The default value of Long
is 0.
Присваивания литераловLiteral assignments
Можно объявить и инициализировать Long
переменную, назначив ей десятичный литерал, шестнадцатеричный литерал, Восьмеричный литерал или (начиная с Visual Basic 2017) двоичный литерал.You can declare and initialize a Long
variable by assigning it a decimal literal, a hexadecimal literal, an octal literal, or (starting with Visual Basic 2017) a binary literal. Если целочисленный литерал выходит за пределы диапазона Long
(то есть, если он меньше Int64.MinValue или больше Int64.MaxValue), возникает ошибка компиляции.If the integer literal is outside the range of Long
(that is, if it is less than Int64.MinValue or greater than Int64.MaxValue, a compilation error occurs.
В следующем примере целые числа, равные 4 294 967 296 и представленные в виде десятичного, шестнадцатеричного и двоичного литерала, назначаются значениям Long
.In the following example, integers equal to 4,294,967,296 that are represented as decimal, hexadecimal, and binary literals are assigned to Long
values.
Dim longValue1 As Long = 4294967296
Console.WriteLine(longValue1)
Dim longValue2 As Long = &h200000000
Console.WriteLine(longValue2)
Dim longValue3 As Long = &B1_0000_0000_0000_0000_0000_0000_0000_0000
Console.WriteLine(longValue3)
' The example displays the following output:
' 4294967296
' 4294967296
' 4294967296
Примечание
Используйте префикс &h
или &H
, чтобы обозначить шестнадцатеричный литерал, префикс &b
или &B
обозначить двоичный литерал, а также префикс &o
или &O
обозначить Восьмеричный литерал.You use the prefix &h
or &H
to denote a hexadecimal literal, the prefix &b
or &B
to denote a binary literal, and the prefix &o
or &O
to denote an octal literal. У десятичных литералов префиксов нет.Decimal literals have no prefix.
Начиная с Visual Basic 2017, можно также использовать символ подчеркивания () в _
качестве разделителя цифр, чтобы улучшить удобочитаемость, как показано в следующем примере.Starting with Visual Basic 2017, you can also use the underscore character, _
, as a digit separator to enhance readability, as the following example shows.
Dim longValue1 As Long = 4_294_967_296
Console.WriteLine(longValue1)
Dim longValue2 As Long = &h2_0000_0000
Console.WriteLine(longValue2)
Dim longValue3 As Long = &B1_0000_0000_0000_0000_0000_0000_0000_0000
Console.WriteLine(longValue3)
' The example displays the following output:
' 4294967296
' 4294967296
' 4294967296
Начиная с Visual Basic 15,5, можно также использовать символ подчеркивания () в _
качестве начального разделителя между префиксом и шестнадцатеричными, двоичными или восьмеричными цифрами.Starting with Visual Basic 15.5, you can also use the underscore character (_
) as a leading separator between the prefix and the hexadecimal, binary, or octal digits. Пример:For example:
Dim number As Long = &H_0FAC_0326_1489_D68C
Чтобы использовать символ подчеркивания в качестве начального разделителя, нужно добавить в файл проекта Visual Basic (*.vbproj) следующий элемент:To use the underscore character as a leading separator, you must add the following element to your Visual Basic project (*.vbproj) file:
<PropertyGroup>
<LangVersion>15.5</LangVersion>
</PropertyGroup>
Для получения дополнительной информации см.For more information see setting the Visual Basic language version.
Числовые литералы также могут включать L
символ типа для обозначения Long
типа данных, как показано в следующем примере.Numeric literals can also include the L
type character to denote the Long
data type, as the following example shows.
Dim number = &H_0FAC_0326_1489_D68CL
Советы по программированиюProgramming tips
Вопросы взаимодействия.Interop Considerations. Если вы взаимодействуете с компонентами, которые не написаны для .NET Framework, например автоматизации или COM-объекты, помните, что
Long
в других средах используется другая ширина данных (32 бит).If you are interfacing with components not written for the .NET Framework, for example Automation or COM objects, remember thatLong
has a different data width (32 bits) in other environments. При передаче аргумента 32-bit в такой компонент объявите его какInteger
вместоLong
в новом коде Visual Basic.If you are passing a 32-bit argument to such a component, declare it asInteger
instead ofLong
in your new Visual Basic code.Расширяющие.Widening.
Long
Тип данных расширяется доDecimal
,Single
илиDouble
.TheLong
data type widens toDecimal
,Single
, orDouble
. Это означает, что типLong
можно преобразовать в любой из этих типов без возникновения ошибки System.OverflowException.This means you can convertLong
to any one of these types without encountering a System.OverflowException error.Символы типа.Type Characters. При добавлении к литералу символа типа литерала
L
производится принудительное приведение литерала к типу данныхLong
.Appending the literal type characterL
to a literal forces it to theLong
data type. При добавлении символа идентификатора типа&
к любому идентификатору производится принудительное приведение этого идентификатора к типуLong
.Appending the identifier type character&
to any identifier forces it toLong
.Тип Framework.Framework Type. В .NET Framework данный тип соответствует структуре System.Int64.The corresponding type in the .NET Framework is the System.Int64 structure.
См. также разделSee also
Справочник по C#. Целочисленные типы
-
- Чтение занимает 2 мин
-
В этой статье
Целочисленные типы представляют целые числа.The integral numeric types represent integer numbers. Все целочисленные типы являются типами значений.All integral numeric types are value types. Они также представляют собой простые типы и могут быть инициализированы литералами.They are also simple types and can be initialized with literals. Все целочисленные типы поддерживают арифметические операторы, побитовые логические операторы, операторы сравнения и равенства.All integral numeric types support arithmetic, bitwise logical, comparison, and equality operators.
Характеристики целочисленных типовCharacteristics of the integral types
C# поддерживает следующие предварительно определенные целочисленные типы:C# supports the following predefined integral types:
Ключевое слово или тип C#C# type/keyword | ДиапазонRange | РазмерSize | Тип .NET.NET type |
---|---|---|---|
sbyte | От -128 до 127-128 to 127 | 8-разрядное целое число со знакомSigned 8-bit integer | System.SByte |
byte | От 0 до 2550 to 255 | 8-разрядное целое число без знакаUnsigned 8-bit integer | System.Byte |
short | От -32 768 до 32 767-32,768 to 32,767 | 16-разрядное целое число со знакомSigned 16-bit integer | System.Int16 |
ushort | От 0 до 65 5350 to 65,535 | 16-разрядное целое число без знакаUnsigned 16-bit integer | System.UInt16 |
int | От -2 147 483 648 до 2 147 483 647-2,147,483,648 to 2,147,483,647 | 32-разрядное целое число со знакомSigned 32-bit integer | System.Int32 |
uint | От 0 до 4 294 967 2950 to 4,294,967,295 | 32-разрядное целое число без знакаUnsigned 32-bit integer | System.UInt32 |
long | От -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807-9,223,372,036,854,775,808 to 9,223,372,036,854,775,807 | 64-разрядное целое число со знакомSigned 64-bit integer | System.Int64 |
ulong | От 0 до 18 446 744 073 709 551 6150 to 18,446,744,073,709,551,615 | 64-разрядное целое число без знакаUnsigned 64-bit integer | System.UInt64 |
В приведенной выше таблице каждый тип ключевого слова C# из крайнего левого столбца является псевдонимом для соответствующего типа .NET.In the preceding table, each C# type keyword from the leftmost column is an alias for the corresponding .NET type. Они взаимозаменяемые.They are interchangeable. Например, следующие объявления объявляют переменные одного типа:For example, the following declarations declare variables of the same type:
int a = 123;
System.Int32 b = 123;
По умолчанию все целочисленные типы имеют значение 0
.The default value of each integral type is zero, 0
. Все целочисленные типы имеют константы MinValue
и MaxValue
с минимальным и максимальными итоговыми значениями этого типа.Each of the integral types has the MinValue
and MaxValue
constants that provide the minimum and maximum value of that type.
Используйте структуру System.Numerics.BigInteger, чтобы представить целое число со знаком без верхней и нижней границ.Use the System.Numerics.BigInteger structure to represent a signed integer with no upper or lower bounds.
Целочисленные литералыInteger literals
Целочисленные литералы могут быть:Integer literals can be
- десятичным числом: без префикса;decimal: without any prefix
- шестнадцатеричным числом: с префиксом
0x
или0X
;hexadecimal: with the0x
or0X
prefix - двоичными: с префиксом
0b
или0B
(доступно в C# 7.0 и более поздних версиях).binary: with the0b
or0B
prefix (available in C# 7.0 and later)
В приведенном ниже коде показан пример каждого из них.The following code demonstrates an example of each:
var decimalLiteral = 42;
var hexLiteral = 0x2A;
var binaryLiteral = 0b_0010_1010;
В предыдущем примере также показано использование _
в качестве цифрового разделителя, который поддерживается, начиная с версии C# 7.0.The preceding example also shows the use of _
as a digit separator, which is supported starting with C# 7.0. Цифровой разделитель можно использовать со всеми видами числовых литералов.You can use the digit separator with all kinds of numeric literals.
Тип целочисленного литерала определяется его суффиксом следующим образом:The type of an integer literal is determined by its suffix as follows:
Если литерал не имеет суффикса, его типом будет первый из следующих типов, в котором может быть представлено его значение:
int
,uint
,long
,ulong
.If the literal has no suffix, its type is the first of the following types in which its value can be represented:int
,uint
,long
,ulong
.Если у литерала есть суффикс
U
илиu
, его типом будет первый из следующих типов, в котором может быть представлено его значение:uint
,ulong
.If the literal is suffixed byU
oru
, its type is the first of the following types in which its value can be represented:uint
,ulong
.Если у литерала есть суффикс
L
илиl
, его типом будет первый из следующих типов, в котором может быть представлено его значение:long
,ulong
.If the literal is suffixed byL
orl
, its type is the first of the following types in which its value can be represented:long
,ulong
.Примечание
Строчную букву
l
можно использовать в качестве суффикса.You can use the lowercase letterl
as a suffix. Однако при этом выдается предупреждение компилятора, так как буквуl
можно перепутать с цифрой1
.However, this generates a compiler warning because the letterl
can be confused with the digit1
. Для ясности используйтеL
.UseL
for clarity.Если у литерала есть суффикс
UL
,Ul
,uL
,ul
,LU
,Lu
,lU
илиlu
, его тип —ulong
.If the literal is suffixed byUL
,Ul
,uL
,ul
,LU
,Lu
,lU
, orlu
, its type isulong
.
Если значение, представленное целочисленным литералом, превышает UInt64.MaxValue, происходит ошибка компиляции CS1021.If the value represented by an integer literal exceeds UInt64.MaxValue, a compiler error CS1021 occurs.
Если определенный тип целочисленного литерала — int
, а значение, представленное литералом, находится в диапазоне целевого типа, значение можно неявно преобразовать в sbyte
, byte
, short
, ushort
, uint
или ulong
:If the determined type of an integer literal is int
and the value represented by the literal is within the range of the destination type, the value can be implicitly converted to sbyte
, byte
, short
, ushort
, uint
, or ulong
:
byte a = 17;
byte b = 300; // CS0031: Constant value '300' cannot be converted to a 'byte'
Как показано в предыдущем примере, если значение литерала выходит за пределы диапазона целевого типа, возникает ошибка компилятора CS0031.As the preceding example shows, if the literal’s value is not within the range of the destination type, a compiler error CS0031 occurs.
Можно также использовать приведение для преобразования значения, представленного целочисленным литералом, в тип, отличный от определенного типа литерала:You can also use a cast to convert the value represented by an integer literal to the type other than the determined type of the literal:
var signedByte = (sbyte)42;
var longVariable = (long)42;
ПреобразованияConversions
Любой целочисленный тип можно преобразовать в любой другой целочисленный тип.You can convert any integral numeric type to any other integral numeric type. Если целевой тип может хранить все значения исходного типа, преобразование является неявным.If the destination type can store all values of the source type, the conversion is implicit. В противном случае необходимо использовать выражение приведения для выполнения явного преобразования.Otherwise, you need to use a cast expression to perform an explicit conversion. Для получения дополнительной информации см. статью Встроенные числовые преобразования.For more information, see Built-in numeric conversions.
Спецификация языка C#C# language specification
Дополнительные сведения см. в следующих разделах статьи Спецификация языка C#:For more information, see the following sections of the C# language specification:
См. такжеSee also
Целочисленные типы данных в C++: short, int и long | Уроки С++
Обновл. 2 Сен 2020 |
На этом уроке мы рассмотрим целочисленные типы данных в языке С++, их диапазоны значений, операцию деления, а также переполнение (что это такое и примеры).
Целочисленные типы данных
Целочисленный тип данных — это тип, переменные которого могут содержать только целые числа (без дробной части, например: -2, -1, 0, 1, 2). В языке C++ есть 5 основных целочисленных типов, доступных для использования:
Категория | Тип | Минимальный размер |
Символьный тип данных | char | 1 байт |
Целочисленный тип данных | short | 2 байта |
int | 2 байта (но чаще всего 4 байта) | |
long | 4 байта | |
long long | 8 байт |
Примечание: Тип char — это особый случай: он является как целочисленным, так и символьным типом данных. Об этом детально мы поговорим на одном из следующих уроков.
Основным различием между целочисленными типами, перечисленными выше, является их размер, чем он больше, тем больше значений сможет хранить переменная этого типа.
Определение целочисленных переменных
Определение происходит следующим образом:
char c;
short int si; // допустимо
short s; // предпочтительнее
int i;
long int li; // допустимо
long l; // предпочтительнее
long long int lli; // допустимо
long long ll; // предпочтительнее
| char c; short int si; // допустимо short s; // предпочтительнее int i; long int li; // допустимо long l; // предпочтительнее long long int lli; // допустимо long long ll; // предпочтительнее |
В то время как полные названия short int
, long int
и long long int
могут использоваться, их сокращенные версии (без int
) более предпочтительны для использования. К тому же постоянное добавление int
затрудняет чтение кода (легко перепутать с именем переменной).
Диапазоны значений и знак целочисленных типов данных
Как вы уже знаете из предыдущего урока, переменная с n-ным количеством бит может хранить 2n возможных значений. Но что это за значения? Это значения, которые находятся в диапазоне. Диапазон — это значения от и до, которые может хранить определенный тип данных. Диапазон целочисленной переменной определяется двумя факторами: её размером (измеряется в битах) и её знаком (который может быть signed или unsigned).
Целочисленный тип signed (со знаком) означает, что переменная может содержать как положительные, так и отрицательные числа. Чтобы объявить переменную как signed, используйте ключевое слово signed
:
signed char c;
signed short s;
signed int i;
signed long l;
signed long long ll;
| signed char c; signed short s; signed int i; signed long l; signed long long ll; |
По умолчанию, ключевое слово signed
пишется перед типом данных.
1-байтовая целочисленная переменная со знаком (signed) имеет диапазон значений от -128 до 127, т.е. любое значение от -128 до 127 (включительно) может храниться в ней безопасно.
В некоторых случаях мы можем заранее знать, что отрицательные числа в программе использоваться не будут. Это очень часто встречается при использовании переменных для хранения количества или размера чего-либо (например, ваш рост или вес не может быть отрицательным).
Целочисленный тип unsigned (без знака) может содержать только положительные числа. Чтобы объявить переменную как unsigned, используйте ключевое слово unsigned
:
unsigned char c;
unsigned short s;
unsigned int i;
unsigned long l;
unsigned long long ll;
| unsigned char c; unsigned short s; unsigned int i; unsigned long l; unsigned long long ll; |
1-байтовая целочисленная переменная без знака (unsigned) имеет диапазон значений от 0 до 255.
Обратите внимание, объявление переменной как unsigned означает, что она не сможет содержать отрицательные числа (только положительные).
Теперь, когда вы поняли разницу между signed и unsigned, давайте рассмотрим диапазоны значений разных типов данных:
Размер/Тип | Диапазон значений |
1 байт signed | от -128 до 127 |
1 байт unsigned | от 0 до 255 |
2 байта signed | от -32 768 до 32 767 |
2 байта unsigned | от 0 до 65 535 |
4 байта signed | от -2 147 483 648 до 2 147 483 647 |
4 байта unsigned | от 0 до 4 294 967 295 |
8 байтов signed | от -9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 |
8 байтов unsigned | от 0 до 18 446 744 073 709 551 615 |
Для математиков: Переменная signed с n-ным количеством бит имеет диапазон от -(2n-1) до 2n-1-1. Переменная unsigned с n-ным количеством бит имеет диапазон от 0 до (2n)-1.
Для нематематиков: Используем таблицу 🙂
Начинающие программисты иногда путаются между signed и unsigned переменными. Но есть простой способ запомнить их различия. Чем отличается отрицательное число от положительного? Правильно! Минусом спереди. Если минуса нет, значит число — положительное. Следовательно, целочисленный тип со знаком (signed) означает, что минус может присутствовать, т.е. числа могут быть как положительными, так и отрицательными. Целочисленный тип без знака (unsigned) означает, что минус спереди отсутствует, т.е. числа могут быть только положительными.
Что используется по умолчанию: signed или unsigned?
Так что же произойдет, если мы объявим переменную без указания signed или unsigned?
Категория | Тип | По умолчанию |
Символьный тип данных | char | signed или unsigned (в большинстве случаев signed) |
Целочисленный тип данных | short | signed |
int | signed | |
long | signed | |
long long | signed |
Все целочисленные типы данных, кроме char, являются signed по умолчанию. Тип char может быть как signed, так и unsigned (но, обычно, signed).
В большинстве случаев ключевое слово signed не пишется (оно и так используется по умолчанию).
Программисты, как правило, избегают использования целочисленных типов unsigned, если в этом нет особой надобности, так как с переменными unsigned ошибок, по статистике, возникает больше, нежели с переменными signed.
Правило: Используйте целочисленные типы signed, вместо unsigned.
Переполнение
Вопрос: «Что произойдет, если мы попытаемся использовать значение, которое находится вне диапазона значений определенного типа данных?». Ответ: «Переполнение».
Переполнение (англ. «overflow») случается при потере бит из-за того, что переменной не было выделено достаточно памяти для их хранения.
На уроке №28 мы говорили о том, что данные хранятся в бинарном (двоичном) формате и каждый бит может иметь только 2 возможных значения (0
или 1
). Вот как выглядит диапазон чисел от 0 до 15 в десятичной и двоичной системах:
Десятичная система | Двоичная система |
0 | 0 |
1 | 1 |
2 | 10 |
3 | 11 |
4 | 100 |
5 | 101 |
6 | 110 |
7 | 111 |
8 | 1000 |
9 | 1001 |
10 | 1010 |
11 | 1011 |
12 | 1100 |
13 | 1101 |
14 | 1110 |
15 | 1111 |
Как вы можете видеть, чем больше число, тем больше ему требуется бит. Поскольку наши переменные имеют фиксированный размер, то на них накладываются ограничения на количество данных, которые они могут хранить.
Примеры переполнения
Рассмотрим переменную unsigned, которая состоит из 4-х бит. Любое из двоичных чисел, перечисленных в таблице выше, поместится внутри этой переменной.
«Но что произойдет, если мы попытаемся присвоить значение, которое занимает больше 4-х бит?». Правильно! Переполнение. Наша переменная будет хранить только 4 наименее значимых (те, что справа) бита, все остальные — потеряются.
Например, если мы попытаемся поместить число 21 в нашу 4-битную переменную:
Десятичная система | Двоичная система |
21 | 10101 |
Число 21 занимает 5 бит (10101). 4 бита справа (0101) поместятся в переменную, а крайний левый бит (1) просто потеряется. Т.е. наша переменная будет содержать 0101, что равно 101 (нуль спереди не считается), а это уже число 5, а не 21.
Примечание: О конвертации чисел из двоичной системы в десятичную и наоборот будет отдельный урок, где мы всё детально рассмотрим и обсудим.
Теперь рассмотрим пример в коде (тип short занимает 16 бит):
#include <iostream>
int main()
{
unsigned short x = 65535; // наибольшее значение, которое может хранить 16-битная unsigned переменная
std::cout << «x was: » << x << std::endl;
x = x + 1; // 65536 — это число больше максимально допустимого числа из диапазона допустимых значений. Следовательно, произойдет переполнение, так как переменнная x не может хранить 17 бит
std::cout << «x is now: » << x << std::endl;
return 0;
}
| #include <iostream> int main() { unsigned short x = 65535; // наибольшее значение, которое может хранить 16-битная unsigned переменная std::cout << «x was: » << x << std::endl; x = x + 1; // 65536 — это число больше максимально допустимого числа из диапазона допустимых значений. Следовательно, произойдет переполнение, так как переменнная x не может хранить 17 бит std::cout << «x is now: » << x << std::endl; return 0; } |
Результат выполнения программы:
x was: 65535
x is now: 0
Что случилось? Произошло переполнение, так как мы попытались присвоить переменной x
значение больше, чем она способна в себе хранить.
Для тех, кто хочет знать больше: Число 65 535 в двоичной системе счисления представлено как 1111 1111 1111 1111. 65 535 — это наибольшее число, которое может хранить 2-байтовая (16 бит) целочисленная переменная без знака, так как это число использует все 16 бит. Когда мы добавляем 1, то получаем число 65 536. Число 65 536 представлено в двоичной системе как 1 0000 0000 0000 0000, и занимает 17 бит! Следовательно, самый главный бит (которым является 1) теряется, а все 16 бит справа — остаются. Комбинация 0000 0000 0000 0000 соответствует десятичному 0, что и является нашим результатом.
Аналогичным образом, мы получим переполнение, использовав число меньше минимального из диапазона допустимых значений:
#include <iostream>
int main()
{
unsigned short x = 0; // наименьшее значение, которое 2-байтовая unsigned переменная может хранить
std::cout << «x was: » << x << std::endl;
x = x — 1; // переполнение!
std::cout << «x is now: » << x << std::endl;
return 0;
}
| #include <iostream> int main() { unsigned short x = 0; // наименьшее значение, которое 2-байтовая unsigned переменная может хранить std::cout << «x was: » << x << std::endl; x = x — 1; // переполнение! std::cout << «x is now: » << x << std::endl; return 0; } |
Результат выполнения программы:
x was: 0
x is now: 65535
Переполнение приводит к потере информации, а это никогда не приветствуется. Если есть хоть малейшее подозрение или предположение, что значением переменной может быть число, которое находится вне диапазона допустимых значений используемого типа данных — используйте тип данных побольше!
Правило: Никогда не допускайте возникновения переполнения в ваших программах!
Деление целочисленных переменных
В языке C++ при делении двух целых чисел, где результатом является другое целое число, всё довольно предсказуемо:
#include <iostream>
int main()
{
std::cout << 20 / 4 << std::endl;
return 0;
}
| #include <iostream> int main() { std::cout << 20 / 4 << std::endl; return 0; } |
Результат:
5
Но что произойдет, если в результате деления двух целых чисел мы получим дробное число? Например:
#include <iostream>
int main()
{
std::cout << 8 / 5 << std::endl;
return 0;
}
| #include <iostream> int main() { std::cout << 8 / 5 << std::endl; return 0; } |
Результат:
1
В языке C++ при делении целых чисел результатом всегда будет другое целое число. А такие числа не могут иметь дробь (она просто отбрасывается, не округляется!).
Рассмотрим детально вышеприведенный пример: 8 / 5 = 1.6
. Но как мы уже знаем, при делении целых чисел результатом является другое целое число. Таким образом, дробная часть (0.6
) значения отбрасывается и остается 1
.
Правило: Будьте осторожны при делении целых чисел, так как любая дробная часть всегда отбрасывается.
Оценить статью:
Загрузка…
Поделиться в социальных сетях:
Вся правда о целочисленных типах в C / Хабр
Для начала несколько вопросов:
- Тип
char
по умолчанию знаковый или нет? Аint
? - Законно ли неявное приведение
(signed char *)
к(char *)
? А то же дляint
? - Сколько бит в
unsigned char
? - Какое максимальное число гарантированно можно поместить в
int
? А минимальное? - Тип
long
определённо больше, чемchar
, не так ли?
Разумеется, экспериментально искать ответы на эти вопросы с помощью вашего любимого компилятора в вашей любимой системе на вашем любимом компьютере1) — не лучшая идея. Мы говорим о стандарте языка (С99 и новее).
Если вы уверенно сможете правильно ответить на эти вопросы, тогда эта статья не для вас. В противном случае десять минут, потраченные на её чтение, будут весьма полезны.
Предположу, что вы ответили
- Знаковые оба.
- Законны оба.
- 8.
- 2147483647. -2147483648.
- Конечно, Кэп.
А правильные ответы такие
char
— не регламентируется,int
— знаковый.- Для
int
— законно, а дляchar
— нет. - Не менее 8.
- 32767. -32767
- Вообще говоря, нет.
Про signed
и unsigned
Все целочисленные типы кроме char
, по умолчанию знаковые (signed).
С char
ситуация сложнее. Стандарт устанавливает три различных типа: char
, signed char
, unsigned char
. В частности, указатель типа (signed char *)
не может быть неявно приведён к типу (char *)
.
Хотя формально это три разных типа, но фактически char
эквивалентен либо signed char
, либо unsigned char
— на выбор компилятора (стандарт ничего конкретного не требует).
Подробнее про char
я написал в комментариях.
О размере unsigned char
Тип unsigned char
является абстракцией машинного байта. Важность этого типа проявляется в том, что С может адресовать память только с точностью до байта. На большинстве архитектур размер байта равен 8 бит, но бывают и исключения. Например, процессоры с 36-битной архитектурой как правило имеют 9-битный байт, а в некоторых DSP от Texas Instruments байты состоят из 16 или 32 бит. Древние архитектуры могут иметь короткие байты из 4, 5 или 7 бит.
Стандарт С вынужден отказаться от допотопных архитектур и требует, чтобы байты были как минимум 8-битные. Конкретное значение (CHAR_BIT
2)) для данной платформы записано в заголовочном файле limits.h
.
Размеры целочисленных типов в С
C переносимый, поэтому в нём базовые целочисленные типы (char
, short
, int
и др.) не имеют строго установленного размера, а зависят от платформы. Однако эти типы не были бы переносимы, если бы
их размеры были совершенно произвольные: стандарт устанавливает минимальные диапазоны принимаемых значений для всех базовых целочисленные типов. А именно,
signed char:
-127…127 (не -128…127; аналогично другие типы)unsigned char
: 0…255 (= 28−1)signed short
: -32767…32767unsigned short
: 0…65535 (= 216−1)signed int
: -32767…32767unsigned int
: 0…65535 (= 216−1)signed long
: -2147483647…2147483647unsigned long
: 0…4294967295 (= 232−1)signed long long
: -9223372036854775807…9223372036854775807unsigned long long
: 0…18446744073709551615 (= 264−1)
Стандарт требует, чтобы максимальное значение unsigned char
было 2CHAR_BIT−1 (см. предыдущий пункт).
Стандарт требует sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)
. Таким образом, вполне законны ситуации типа sizeof(char)=sizeof(long)=32
. Для некоторых DSP от Texas Instruments так и есть.
Конкретные значения этих диапазонов для данной платформы указаны заголовочном файле limits.h
.
Новые типы в С99
После того, как C99 добавил тип long long
, целочисленных типов и путаницы стало ещё больше. Чтобы навести порядок, стандарт ввёл заголовочный файл stdint.h
, где определяются типы вроде int16_t
(равно 16 бит), int_least16_t
(минимальный тип, способный вместить 16 бит), int_fast16_t
(по крайней мере 16 бит, работа с этим типом наиболее быстрая на данной платформе) и т. п.
least- и fast-типы фактически являются заменой рассмотренных выше типов int
, short
, long
и т. п. только вдобавок дают программисту возможность выбора между скоростью и размером.
От типов вроде int16_t
, со строгим указанием размера, страдает переносимость: скажем, на архитектуре с 9-битным байтом может просто не найтись 16-битного регистра. Поэтому стандарт тут явно говорит, что эти типы опциональны. Но учитывая, что какой бы код вы ни писали, чуть менее чем во всех случаях целевая архитектура фиксирована даже в худшем случае с точностью до семейства (скажем, x86 или AVR), внутри которого, размер байта не может вдруг поменяться, то переносимость фактически сохраняется. Более того, типы вроде int16_t
оказались даже более популярными, чем int_least16_t
и int_fast16_t
, а при низкоуровневом программировании (микроконтроллеры, драйверы устройств) и подавно, ибо там зачастую неопределённость размера переменной просто непозволительна.
1) Для удобства тройку архитектура+ОС+компилятор далее будем называть просто платформой.
2) Этот макрос правильнее было бы назвать UCHAR_BIT
, но по причинам совместимости он называется так, как называется.
Общаться с 64-битным long long в Visual C++ / Песочница / Хабр
Тип данных long long — это единственный целочисленный тип данных в Visual С++, который весит 8 байт и может использовать значения выше 2^31 — 1…..-2^31. Если у вас 64-битная система, то тип long тоже будет 8-байтовым. А в 32-разрядной системе приходится довольствоваться только им. Этот тип данных получил права только в последних версиях С++, например, в С++ 6.0 вы его найдёте, но работать с ним там одно удовольствие.
Несмотря на то, что у long long есть закреплённые права и обязанности. Использовать его всё равно следует по-особенному. Для начала следует учесть, что простое присваивание ему значений не прокатит. Если вы хотите присвоить значение переменной типа long long, то не забудьте приставить к числу две буквы LL (которые видимо символизируют, что число «longlong» 64-битное).
long long temp = 1100LL;
Далее: про соответствие типов. Думаю, когда человек первый раз «берёт в руки» этот тип данных ему становится интересно, а как он соотносится с типом int?
Отношения у long long c int очень интересные. Если вы хотите складывать два числа int, зная, что результат выйдет за диапазон int, то вы можете использовать long long. Сложите два int присвоите long long и все будут счастливы.
int a1 = 2000000000;
int a2 = 2000000000;
long long b = a1 + a2;
b равен 400000000. И здесь проблем возникнуть не должно.
С умножением int’ов дела гораздо интереснее. Если вы просто возьмёте две переменные типа int и перемножите их между собой, зная, что результат выйдет за пределы int, то ничего у вас не получится. Переменная типа long long будет просто равна нулю. В итоге, чтобы умножать в Visual C++ числа типа int и получить long long следует проделать сложения через цикл, т.е. если мы хотим умножить число а на число b, то всё будет выглядеть так.
long long temp = 0;
for (int i = 0; i < a; i++) {
temp += b;
}
И только тогда захочет быть произведением.
Типы данных | Arduino технологии
Тип | Занимаемый размер (байт) | Минимальное значение | Максимальное значение |
---|---|---|---|
boolean | 1 | false | true |
char | 1 | -128 | 127 |
byte | 1 | 0 | 255 |
int, short | 2 | -32768 | 32767 |
unsigned int | 2 | 0 | 65535 |
long | 4 | -2147483648 | 2147483647 |
unsigned long | 4 | 0 | 4294967295 |
float, double | 4 | -3.4028235E+38 | 3.4028235E+38 |
boolean
Логический тип, может принимать только 2 значения — true (правда) и false (ложь). В памяти занимает 1 байт.
bool a = true;
a = false;
числа
char
Тип позволяет хранить 1 алфавитно-цифровой символ и занимае 1 байт. Для записи символа используются одинарные кавычки.
В памяти хранится число, соответствующее записанному символу в таблице ASCII, поэтому над переменной можно производить арифметические действия.
char a = 'A'; // число 65 по таблице ASCII
a++; // число 66, соответствующее символу 'B'
char b = 65; // тоже самое, что присвоить символ 'A'
Переменная это типа — знаковая, диапазон допустимых значений — от -128 до 127.
byte
Тип для хранения однобайтового целого беззнакового числа. Соответственно диапазон значений от 0 до 255.
byte x = 155;
int
Пожалуй самый частоиспользуемый тип для хранения целых чисел со знаком — integer (целое число). Занимает 2 байта и может хранить цисла от -32768 до 32767.
На платформе Arduino также присутствует тип , который ничем не отличается от типа int.
int y = 10;
unsigned int
Беззнаковое целое число, занимает так же, как и int, 2 байта. Диапазон значений — от 0 до 65535.
long
Тип long служит для хранение больших целых знаковых чисел. Диапазон его значений от -2147483648 до 2147483647, а занимает в памяти он 4 байта.
unsigned long
Беззнаковое целое число расширенного диапазона может хранить значения от 0 до 4294967295 и занимает 4 байта.
float
Тип данных чисел с плавающей точкой (или с плавающей запятой). Используется для нецелочисленных расчетов. В Arduino используется например для считывания значений с аналоговых пинов. Диапазон значений от -3.4028235E+38 до 3.4028235E+38,а занимает такая переменная 4 байта.
Точность — 6-7 знаков после запятой.
double
Тип ничем не отличается от типа float и введен для обратной совместимости. На многих других платформах он имеет большую чем у float точность.
string
Тип для хранение текстовых строк. Является массивом символов типа char и символа конца строки ‘\0’ в последнем его элементе. Не путать с классами string и String.
Строка может быть создана и инициализирована несколькими способами:
char str[7]; // объявление пустой строки с резервированием 7 символов - 6 под строку и последний - под символ завершения строки
char str[7] = "qwerty"; // объявление строки с инициализацией начальным значением
char str[7] = {'q', 'w', 'e', 'r', 't', 'y', '\0'}; // посимвольная инициализация
char str[] = "qwerty"; // более удобная инициализация без указания размера - он посчитается автоматические с учетом символа конца строки
Если забыть указать символ конца строки при посимвольной инициализации или не отвести под него место, то функции работы со строками будут работать некорректно.
массив
Массив — это набор элементов одного типа с доступом к каждому элементу по индексу.
int arr[6]; // объявление массива с выделением памяти под 6 элементов типа int
int arr[] = {1, 2, 3, 4, 5, 6}; // объявление массива с инициализацией его начальными значениями, при этом не обязательно указывать его размер, однако превышать его нельзя
char str[] = "qwerty"; // инициализация массива символов - строки
Нумерация индексов массива начинается с 0.
int arr[10];
arr[0] = 123; // пример присвоение значения первому элементу массива
int b = arr[1]; // пример считывание значения из второго по счету элемента массива
void
Ключевое слово void используется при объявлении функции, которая не возвращает значения.
Преобразование типов
Преобразование типов — это приведение значение переменной к другому типа, отличному от типа данной переменной.
Приведение типов делится на явное и неявное.
Пример явного приведения типа:
float a = 7.5;
int b = (int)a; // в переменную b будет записано значение переменной a, приведенной к целочисленному типу, то есть число 7
Пример неявного приведения типа:
int a = 1;
if (a) {
// код будет выполнен в случае ненулевого значения переменной a
}
Условная конструкция if принимает на вход значение типа boolean, поэтому целочисленное значение переменной a будет приведено к типа boolean.
Еще один пример явного приведения типа:
float res = (float)17 / 2; // в переменную res будет сохранение значение 8.5, тогда как без приведения к типу float в ней бы оказалось бы 8.0
Типы int, short и long. Язык Си
Типы int, short и long
В языке Си имеется несколько целых типов, поэтому у вас есть возможность вносить изменения в свою программу, чтобы она удовлетворяла требованиям конкретной машины или определенного задания. Если вы не хотите заботиться о таких деталях, то, вообще говоря, вы можете просто остановиться на типе int и не думать больше о других возможностях.
Все данные типов int, short и long являются «числами со знаком», т. е. допустимыми значениями переменных этих типов могут быть только целые числа — положительные, отрицательные и нуль. Один бит используется для указания знака числа, поэтому максимальное число со знаком, которое можно представить в слове, меньше, чем максимальное число без знака. Например, в формате 16-битного слова можно представить любые целые числа без знака, из диапазона от 0 до 65535. Точно так же 16-битное слово можно использовать для представления целых чисел со знаком из диапазона от -32768 до +32767.
Заметим, что длины диапазонов в обоих случаях одинаковые.
Язык Си предоставляет пользователям возможность выбора размера элемента памяти (одного из трех) для представления це лых чисел. Типу int обычно соответствует стандартная длина слова, принятая на используемой машине. При этом гарантируется, что размер элементов памяти, отводимых под данные типа short и long, будет соответственно не больше и не меньше длины элемента памяти, выделяемого типу int. В некоторых вычислительных системах один или оба этих типа реализованы точно так же, как int. Все зависит от того, какое представление лучше соответствует архитектуре конкретной ЭВМ. В табл. 3.1 для каждого компьютера из некоторого множества приведено число битов, используемое для представления данных различных типов, а также диапазоны отображаемых чисел.
Поделитесь на страничке
Следующая глава >
Длинный тип данных — Visual Basic
- 2 минуты на чтение
В этой статье
Содержит 64-битные (8-байтовые) целые числа со знаком в диапазоне значений от -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807 (9,2 … E + 18).
Замечания
Используйте тип данных Long
, чтобы содержать целые числа, которые слишком велики для размещения в типе данных Integer
.
Значение по умолчанию Long
— 0.
Буквальные обозначения
Вы можете объявить и инициализировать переменную Long
, назначив ей десятичный литерал, шестнадцатеричный литерал, восьмеричный литерал или (начиная с Visual Basic 2017) двоичный литерал. Если целочисленный литерал находится за пределами диапазона Long
(то есть, если он меньше Int64.MinValue или больше Int64.MaxValue, возникает ошибка компиляции.
В следующем примере целые числа, равные 4 294 967 296, которые представлены как десятичные, шестнадцатеричные и двоичные литералы, присваиваются значениям Long
.
Dim longValue1 As Long = 4294967296
Console.WriteLine (longValue1)
Dim longValue2 As Long = & h200000000
Console.WriteLine (longValue2)
Dim longValue3 As Long = & B1_0000_0000_0000_0000_0000_0000_0000_0000
Console.WriteLine (longValue3)
'В этом примере отображается следующий вывод:
'4294967296
'4294967296
'4294967296
Примечание
Вы используете префикс & h
или & H
для обозначения шестнадцатеричного литерала, префикс & b
или & B
для обозначения двоичного литерала и префикс & o
или & O
для обозначения восьмеричного литерала.Десятичные литералы не имеют префикса.
Начиная с Visual Basic 2017, вы также можете использовать символ подчеркивания _
в качестве разделителя цифр для повышения удобочитаемости, как показано в следующем примере.
Dim longValue1 As Long = 4_294_967_296
Console.WriteLine (longValue1)
Dim longValue2 As Long = & h2_0000_0000
Console.WriteLine (longValue2)
Dim longValue3 As Long = & B1_0000_0000_0000_0000_0000_0000_0000_0000
Console.WriteLine (longValue3)
'В этом примере отображается следующий вывод:
'4294967296
'4294967296
'4294967296
Начиная с Visual Basic 15.5, вы также можете использовать символ подчеркивания ( _
) в качестве ведущего разделителя между префиксом и шестнадцатеричными, двоичными или восьмеричными цифрами. Например:
Размерное число As Long = & H_0FAC_0326_1489_D68C
Чтобы использовать символ подчеркивания в качестве ведущего разделителя, необходимо добавить в файл проекта Visual Basic (* .vbproj) следующий элемент:
15.5
Для получения дополнительной информации см. Настройку языковой версии Visual Basic.
Числовые литералы также могут включать в себя символ типа L
для обозначения типа данных Long
, как показано в следующем примере.
Размерный номер = & H_0FAC_0326_1489_D68CL
Советы по программированию
Рекомендации по взаимодействию. Если вы взаимодействуете с компонентами, написанными не для .NET Framework, например с объектами автоматизации или COM, помните, что
Long
имеет другую ширину данных (32 бита) в других средах.Если вы передаете 32-битный аргумент такому компоненту, объявите его какInteger
вместоLong
в новом коде Visual Basic.Расширение. Тип данных
Long
расширяется доDecimal
,Single
илиDouble
. Это означает, что вы можете преобразоватьLong
в любой из этих типов без возникновения ошибки System.OverflowException.Тип символов. Добавление символа типа литерала
L
к литералу приводит его к типу данныхLong
. Добавление символа типа идентификатораи
к любому идентификатору приводит к установкеLong
.Тип каркаса. Соответствующим типом в .NET Framework является структура System.Int64.
См. Также
.
Целочисленные типы — ссылка на C #
- 3 минуты на чтение
В этой статье
Целочисленные типы представляют собой целые числа. Все целочисленные типы являются типами значений. Они также являются простыми типами и могут быть инициализированы литералами.Все целочисленные типы поддерживают арифметические, побитовые логические операторы, операторы сравнения и равенства.
Характеристики интегральных типов
C # поддерживает следующие предопределенные целочисленные типы:
Тип / ключевое слово C # | Диапазон | Размер | .NET типа |
---|---|---|---|
сбайт | -128 до 127 | 8-битное целое число со знаком | System.SByte |
байт | 0 до 255 | 8-битное целое число без знака | Система.Байт |
короткий | -32 768 до 32 767 | 16-битное целое со знаком | System.Int16 |
ushort | 0 до 65 535 | 16-разрядное целое число без знака | System.UInt16 |
внутренний | -2 147 483 648 до 2 147 483 647 | 32-битное целое число со знаком | System.Int32 |
uint | 0 до 4 294 967 295 | 32-битное целое число без знака | Система.UInt32 |
длинный | -9,223,372,036,854,775,808 до 9,223,372,036,854,775,807 | 64-битное целое число со знаком | System.Int64 |
улонг | 0 до 18 446 744 073 709 551 615 | 64-битное целое число без знака | System.UInt64 |
В предыдущей таблице каждое ключевое слово типа C # из крайнего левого столбца является псевдонимом для соответствующего типа .NET. Они взаимозаменяемы.Например, следующие объявления объявляют переменные одного и того же типа:
int a = 123;
System.Int32 b = 123;
Значение по умолчанию для каждого целочисленного типа — ноль, 0
. Каждый из целочисленных типов имеет константы MinValue,
и MaxValue,
, которые обеспечивают минимальное и максимальное значение этого типа.
Используйте структуру System.Numerics.BigInteger для представления целого числа со знаком без верхней или нижней границы.
Целочисленные литералы
Целочисленные литералы могут быть
- десятичное : без префикса
- шестнадцатеричный : с префиксом
0x
или0X
- двоичный : с префиксом
0b
или0B
(доступно в C # 7.0 и новее)
Следующий код демонстрирует пример каждого из них:
var decimalLiteral = 42;
var hexLiteral = 0x2A;
var binaryLiteral = 0b_0010_1010;
В предыдущем примере также показано использование _
в качестве разделителя цифр , который поддерживается начиная с C # 7.0. Вы можете использовать разделитель цифр со всеми видами числовых литералов.
Тип целочисленного литерала определяется его суффиксом следующим образом:
Если у литерала нет суффикса, его тип является первым из следующих типов, в которых может быть представлено его значение:
int
,uint
,long
,ulong
.Если литерал имеет суффикс
U
илиu
, его тип является первым из следующих типов, в которых может быть представлено его значение:uint
,ulong
.Если литерал имеет суффикс
L
илиl
, его тип является первым из следующих типов, в которых может быть представлено его значение:long
,ulong
.Примечание
В качестве суффикса можно использовать строчную букву
l
.Однако это генерирует предупреждение компилятора, потому что буквуl
можно спутать с цифрой1
. Для ясности используйтеL
.Если литерал имеет суффикс
UL
,Ul
,uL
,ul
,LU
,Lu
,lU
илиlu
, его тип —ulong
.
Если значение, представленное целочисленным литералом, превышает UInt64.MaxValue, возникает ошибка компилятора CS1021.
Если определенным типом целочисленного литерала является int
и значение, представленное литералом, находится в диапазоне целевого типа, значение может быть неявно преобразовано в sbyte
, byte
, short
, ushort
, uint
или ulong
:
байт a = 17;
байт b = 300; // CS0031: постоянное значение '300' не может быть преобразовано в 'байт'
Как показывает предыдущий пример, если значение литерала выходит за пределы диапазона целевого типа, возникает ошибка компилятора CS0031.
Вы также можете использовать приведение для преобразования значения, представленного целочисленным литералом, в тип, отличный от определенного типа литерала:
var signedByte = (sbyte) 42;
var longVariable = (длинный) 42;
Преобразования
Любой целочисленный тип можно преобразовать в любой другой целочисленный тип. Если целевой тип может хранить все значения исходного типа, преобразование является неявным. В противном случае вам нужно использовать выражение приведения для выполнения явного преобразования.Для получения дополнительной информации см. Встроенные числовые преобразования.
Спецификация языка C #
Дополнительные сведения см. В следующих разделах спецификации языка C #:
См. Также
.
c — Какой тип данных «длинный длинный»?
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.
c ++ — для чего используется «длинный» тип данных?
Переполнение стека
- Около
Продукты
- Для команд
Переполнение стека
Общественные вопросы и ответыПереполнение стека для команд
Где разработчики и технологи делятся частными знаниями с коллегамиВакансии
Программирование и связанные с ним технические возможности карьерного ростаТалант
Нанимайте технических специалистов и создавайте свой бренд работодателяРеклама
Обратитесь к разработчикам и технологам со всего мира- О компании
.