C# supports nine integral types: sbyte
, byte
, short
, ushort
, int
, uint
, long
, ulong
, and char
. The integral types have the following sizes and ranges of values:
sbyte
type represents signed 8-bit integers with values between –128 and 127.byte
type represents unsigned 8-bit integers with values between 0 and 255.short
type represents signed 16-bit integers with values between –32768 and 32767.ushort
type represents unsigned 16-bit integers with values between 0 and 65535.int
type represents signed 32-bit integers with values between –2147483648 and 2147483647.uint
type represents unsigned 32-bit integers with values between 0 and 4294967295.long
type represents signed 64-bit integers with values between –9223372036854775808 and 9223372036854775807.ulong
type represents unsigned 64-bit integers with values between 0 and 18446744073709551615.char
type represents unsigned 16-bit integers with values between 0 to 65535. The set of possible values for the char
type corresponds to the Unicode character set.The integral-type unary and binary operators always operate with signed 32-bit precision, unsigned 32-bit precision, signed 64-bit precision, or unsigned 64-bit precision:
+
and ~ operators, the operand is converted to type T
, where T
is the first of int
, uint
, long
, and ulong
that can fully represent all possible values of the operand. The operation is then performed using the precision of type T
, and the type of the result T
.–
operator, the operand is converted to type T
, where T
is the first of int
and long
that can fully represent all possible values of the operand. The operation is then performed using the precision of type T
, and the type of the result is T
. The unary –
operator cannot be applied to operands of type ulong
.+
, –
, *
, /
, %
, &
, ^
, |
, ==
, !=
, >
, <
, >=
, and <=
operators, the operands are converted to type T
, where T
is the first of int
, uint
, long
, and ulong
that can fully represent all possible values of each operand. The operation is then performed using the precision of type T
, and the type of the result is T
(or bool
for the relational operators).<<
and >>
operators, the left operand is converted to type T
, where T
is the first of int
, uint
, long
, and ulong
that can fully represent all possible values of the operand. The operation is then performed using the precision of type T
, and the type of the result T
.The char
type is classified as an integral type, but it differs from the other integral types in two ways:
char
type. In particular, even though the sbyte
, byte
, and ushort
types have ranges of values that are fully representable using the char
type, implicit conversions from sbyte
, byte
, or ushort
to char
do not exist.char
type must be written as character-literals. Character constants can only be written as integer-literals in combination with a cast. For example, (char)10
is the same as '\x000A'
.The checked
and unchecked
operators and statements are used to control overflow checking for integral-type arithmetic operations and conversions (§7.5.13). In a checked
context, an overflow produces a compile-time error or causes an OverflowException
to be thrown. In an unchecked
context, overflows are ignored and any high-order bits that do not fit in the destination type are discarded.