0和0u的区别

4

来自教科书的文本:

uint类型是32位无符号整数类型。它的默认值为数字0u或0U(两者等效)。字母“ u”表示数字是uint类型(否则它被理解为int)。

那么0和0u之间有区别吗?如果没有,那么为什么默认值是“0u”?使用整数后缀“ u”的优点是什么?

我何时必须使用“5u”,而不仅仅使用“5”?


为了表明它是无符号的。有些值最好表示为绝对值,比如距离。 - Carcigenicate
“5u”的一个可能用途是,如果您喜欢经常使用关键字“var”。如果您写“var j = 5;”,那么它将被存储为int,如果您写“var j = 5u;”,那么它将被存储为uint。 - discussedtree
@Carcigenicate "uint distance = 730480;"。这里不需要使用后缀'u'。 - discussedtree
  1. 匈牙利命名法(在名称中放置类型标识符)通常不被看好。
  2. 这个想法是,如果你知道这个数字永远不需要符号,使用一个显示这个规则的类型是一个好习惯。你获得的额外位数可以使数字的容量翻倍,而占用的空间相同,这可能很有用。
- Carcigenicate
  1. 我在哪里将类型标识符放入名称中了?'uint'应该是类型标识符,但它没有包含在变量名中。变量名是'distance'
  2. 类型标识符'uint'表示'无符号整数',并自动为我提供额外的一位。我不必为此添加后缀'u'。
- discussedtree
2个回答

4

默认情况下,编译器会推断数字字面量为双精度或整型。

  • 如果字面量包含小数点或指数符号,则为双精度。
  • 否则,字面量的类型是 此列表中 可以容纳字面量值的第一个类型: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类型。
double x= 4.0d; //(Here, d is redundant) 

f(float)和m(decimal)后缀是最有用的,当指定浮点或十进制字面量时应始终使用它们。如果没有f后缀,以下行将无法编译,因为3.5将被推断为double类型,而double类型没有到float类型的隐式转换。

float f= 3.5f;

同样地,如果没有加上 m(十进制)后缀,以下代码行将无法编译。
decimal d=-1.25m;

总之,后缀指示编译器将整数字面量(如123)视为某种类型的数字,例如长整型。类似地,双精度字面量则被视为其他类型,例如浮点数、十进制数等。


long i=5 中,5 是一个 int 字面量还是被推断为一个 long 字面量?如果是前者,那么当它被赋值给 i 时是否会进行转换? - bgfvdu3w
1
@Mark,是的,从int到long有隐式(无损)转换。 - ANewGuyInTown

3
他们的类型不同。未指定类型的整数字面量可以根据上下文解释为 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);

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

为什么 uint 的默认值是 '0u' 而不是 '0'? - discussedtree
1
因为 00u 的类型不同,而 0uuint 类型。 - zneak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接