The 8- and 16-bit integral types are: byte, sbyte, short, and ushort.
C# implicitly converts them to larger types as required.
*** This can cause a compile-time error when trying to assign the result back to a small integral type:
short x = 1, y = 1;
short z = x + y; // Compile-time error x and y are implicitly converted to int so that the addition can be performed.int, which cannot be implicitly cast back to a short.To make this compile, we must add an explicit cast:
short z = (short) (x + y);
Floating-point types have special values to deal with the results of certain operations.
These special values are:
The float and double types have constants for NaN, +Infinity, and -Infinity.
The constants that represent special values for double and float are as follows:
| Special value | Double constant | Float constant |
|---|---|---|
NaN | double.NaN | float.NaN |
+infinity | double.PositiveInfinity | float.PositiveInfinity |
-infinity | double.NegativeInfinity | float.NegativeInfinity |
-0 | -0.0 | -0.0f |
For example, you can output the value of Negative Infinity in double:
Console.WriteLine (double.NegativeInfinity); // -Infinity** Dividing a nonzero number by zero results in an infinite value.
For example:
Console.WriteLine ( 1.0 / 0.0); // Infinity
Console.WriteLine (-1.0 / 0.0); // -Infinity
Console.WriteLine ( 1.0 / -0.0); // -Infinity
Console.WriteLine (-1.0 / -0.0); // Infinity** Dividing zero by zero, or subtracting infinity from infinity, results in a NaN.
For example:
Console.WriteLine ( 0.0 / 0.0); // NaN
Console.WriteLine ((1.0 / 0.0) - (1.0 / 0.0)); // NaN** When using ==, a NaN value is never equal to another value, even another NaN value:
Console.WriteLine (0.0 / 0.0 == double.NaN); // False
** To test whether a value is NaN, you must use the float.IsNaN or double.IsNaN method:
Console.WriteLine (double.IsNaN (0.0 / 0.0)); // True** When using object.Equals, however, two NaN values are equal:
Console.WriteLine (object.Equals (0.0 / 0.0, double.NaN)); // True Example:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine(1.0 / 0.0); // Infinity
Console.WriteLine(-1.0 / 0.0); // -Infinity
Console.WriteLine(1.0 / -0.0); // -Infinity
Console.WriteLine(-1.0 / -0.0); // Infinity
Console.WriteLine(0.0 / 0.0); // NaN
Console.WriteLine((1.0 / 0.0) - (1.0 / 0.0)); // NaN
Console.WriteLine(0.0 / 0.0 == double.NaN); // False
Console.WriteLine(double.IsNaN(0.0 / 0.0)); // True
Console.WriteLine(object.Equals(0.0 / 0.0, double.NaN)); // True
Console.ReadLine();
}
}
}
Output:

+0, -0, +Infinity, -Infinity, and NaN.*** During the calculation, decimal is slower than double.
The following table summarizes all the data type convert options:
| Task | Functions | Examples |
|---|---|---|
| Parsing base 10 numbers | ParseTryParse | |
| Parsing from base 2, 8, or 16 | Convert.ToIntegral | |
| Formatting to hexadecimal | ToString | |
| Lossless numeric conversion | Implicit cast | |
| Truncating numeric conversion | Explicit cast | |
| Rounding numeric conversion (real to integral) | Convert.ToIntegral | |
object or System.Object is the ultimate base class for all types.
Any type can be upcast to object.
The following code creates a class Stack to provide a First-In-Last_Out data structure.
public class Stack {
int position;
object[] data = new object[10];
public void Push (object obj) { data[position++] = obj; }
public object Pop() { return data[--position]; }
} Because Stack works with the object type, we can Push and Pop any type to and from the Stack.
Stack stack = new Stack();
stack.Push ("CSS");
string s = (string) stack.Pop(); // Downcast, so explicit cast is needed
Console.WriteLine (s);*** When casting between a value type and object, the CLR must perform the process of boxing and unboxing.
Boxing is the process of converting a value-type to a reference-type, which can be either the object class or an interface.
In the following code, we box an int into an object:
int x = 1;
object obj = x; // Box the intUnboxing is the operation of casting the object back to the original value type:
int y = (int)obj; // Unbox the intUnboxing requires an explicit cast.
C# throws an InvalidCastException if the value type does not match the object type.
For instance, the following throws an exception, because long does not exactly match int:
object obj = 19; // 19 is inferred to be of type int
long x = (long) obj; // InvalidCastExceptionYou change the above code to the following:
object obj = 9;
long x = (int) obj;The following code shows how to unbox a double value to int:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace HelloWorld
{
class Program
{
static void Main(string[] args)
{
object obj = 4.5; // 4.5 is inferred to be of type double
int x = (int)(double)obj; // x is now 4
Console.WriteLine(x);
Console.ReadLine();
}
}
}
Output:
