0和0u之间的差异

时间:2015-04-12 03:22:06

标签: c# integer default-value unsigned

教科书中的文字:

  

uint类型是32位无符号整数类型。它的默认值是   数字0u或0U(两者相当)。 ' u'信表明   该数字是uint类型(否则它被理解为int)。

那么0和0u之间有区别吗?如果没有,那么为什么默认值为' 0u'。使用' u'

后缀整数有什么好处

为什么我必须使用,比如说' 5u'而不是仅仅使用' 5'?

2 个答案:

答案 0 :(得分:3)

默认情况下,编译器会将数字文字推断为double或整数类型。

  • 如果文字包含小数点或指数符号,则为双精度。
  • 否则,文字的类型是此列表中的第一个类型,它可以符合文字的值:int,uint,long, ULONG。

后缀u(或U)和l(或L)很少是必需的,因为uint,long和ulong类型几乎总是可以从int推断或隐式转换:

long i=5; //implicit lossless conversion from int literal to long

类似地,d后缀也是多余的,因为所有带小数点的文字都被推断为双倍。

double x= 4.0d; //(Here, d is redundant) 

f(float)和m(十进制)后缀是最有用的,在指定float或decimal文字时应始终应用。如果没有f后缀,则后续行将无法编译,因为3.5将被推断为double类型,它没有隐式转换为float。

float f= 3.5f;

同样,如果没有m(十进制)后缀,则不会编译以下行。

decimal d=-1.25m;

总之,后缀指示编译器将整数文字(如123)视为特定类型的数字 - 例如long。类似地,double literal被认为是其他类型 - 例如float,decimal等。

答案 1 :(得分:2)

他们的类型不同。虽然根据上下文,可以将未填充的整数文字解释为uintint,但u后缀会强制它为无符号类型。例如,您无法在没有强制转换的情况下将5u分配给int变量,因为它具有uint值。

当表达式的类型很重要时,您将使用它。例如,var i = 5使i成为int,但var i = 5u使i成为uint

在将文字作为参数传递时,您也可以使用它来选择uint重载。例如:

void Foo(int x);
void Foo(uint x);

Foo(5);
Foo(5u);

但一般来说,你不经常需要它。