【问题标题】:Difference between 0 and 0u0和0u的区别
【发布时间】:2015-06-17 14:22:12
【问题描述】:

教科书上的文字:

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

那么0和0u有区别吗?如果不是,那么为什么默认值是'0u'。整数后缀'u'有什么好处?

为什么我必须使用“5u”而不是只使用“5”?

【问题讨论】:

  • 表示它是未签名的。有些值最好用绝对值表示,比如距离。
  • “5u”的一种可能用法是如果您经常使用关键字“var”。如果你写“var j = 5;”,那么它将被存储为一个 int,如果你写“var j = 5u;”,那么它将被存储为一个 uint。
  • @Carcigenicate " uint distance = 730480; "。此处无需使用后缀“u”。
  • 1.匈牙利表示法(在名称中加入类型标识符)通常不受欢迎。 2. 这个想法是,如果你知道数字永远不需要符号,那么最好使用显示该规则的类型。对于相同的空间,您获得的额外位也会使数字的容量翻倍,这可能很有用。
  • 1.我在哪里把类型标识符放在名称中? 'uint' 是类型标识符,它不包含在变量名中。变量名称是“距离” 2。类型标识符“uint”的意思是“无符号整数”,并自动给我一个额外的位。我不必为此添加“u”后缀。

标签: c# integer default-value unsigned


【解决方案1】:

他们的类型不同。虽然根据上下文可以将无后缀整数文字解释为 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'?
  • 因为00u的类型不同,而0uuint之一。
【解决方案2】:

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

  • 如果文字包含小数点或指数符号,则为双精度数。
  • 否则,字面量的类型是 此列表 中可以适合字面量值的第一个类型: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(浮点数)和 m(十进制)后缀是最有用的,在指定浮点数或十进制字面量时应始终应用。如果没有 f 后缀,以下行将无法编译,因为 3.5 将被推断为 double 类型,它没有隐式转换为 float。

float f= 3.5f;

同样,如果没有 m(十进制)后缀,以下行将无法编译。

decimal d=-1.25m;

总之,后缀指示编译器将整型文字(如 123)视为某种类型的数字,例如 long。同样,双精度字面量要考虑其他类型——例如浮点数、十进制等。

【讨论】:

  • long i=5 中,5int 文字还是推断为 long 文字?如果是前者,那是否意味着在分配给i时执行转换?
  • @Mark,是的,存在从 int 到 long 的隐式(无损)转换。
猜你喜欢
  • 2018-12-13
  • 2017-02-28
  • 2018-02-27
  • 2011-04-27
  • 1970-01-01
  • 2011-02-26
  • 2017-10-22
  • 2016-01-08
  • 2014-10-09
相关资源
最近更新 更多