在C/C#/等语言中,您可以告诉编译器一个字面量数字不是它看起来的类型(例如,float
而不是 double
,unsigned long
而不是 int
):
var d = 1.0; // double
var f = 1.0f; // float
var u = 1UL; // unsigned long
有人能给我指出这些的列表吗?我特别是在寻找一个用于short
或Int16
的后缀。
在C/C#/等语言中,您可以告诉编译器一个字面量数字不是它看起来的类型(例如,float
而不是 double
,unsigned long
而不是 int
):
var d = 1.0; // double
var f = 1.0f; // float
var u = 1UL; // unsigned long
有人能给我指出这些的列表吗?我特别是在寻找一个用于short
或Int16
的后缀。
var d = 1.0d; // double
var d0 = 1.0; // double
var d1 = 1e+3; // double
var d2 = 1e-3; // double
var f = 1.0f; // float
var m = 1.0m; // decimal
var i = 1; // int
var ui = 1U; // uint
var ul = 1UL; // ulong
var l = 1L; // long
我想那就是全部了...没有针对short/ushort/byte/sbyte的字面量说明符。
byte b = 42;
)。 - Thomas Levesquesomebyte = (byte)(somebool ? 1 : 0);
- or hor1l
and 1L
both will be treated as long integer but certainly 1L
is more readable than 1l
.翻译后的结果:这里需要补充一点,这些字面量后缀的大小写是等价的,例如 1l
和 1L
都将被视为长整型,但显然 1L
比 1l
更易读。 - RBT从整数字面量:
整数字面量的类型确定如下:
- 如果字面量没有后缀,则将其值表示为以下类型中的第一个:
int
、uint
、long
或ulong
。- 如果字面量被后缀
U
或u
,则将其值表示为以下类型中的第一个:uint
或ulong
。- 如果字面量被后缀
L
或l
,则将其值表示为以下类型中的第一个:long
或ulong
。- 如果字面量被后缀
UL
、Ul
、uL
、ul
、LU
、Lu
、lU
或lu
,则其类型为ulong
。
从实数字面量:
如果实数字面量没有指定实数类型后缀,则其类型为 double。否则,实数类型后缀决定实数字面量的类型,如下所示:
- 被后缀
F
或f
的实数字面量是float
类型。例如,字面量1f
、1.5f
、1e10f
和123.456F
都是float
类型。以 D
或d
结尾的实数字面量属于double
类型。例如,字面量1d
、1.5d
、1e10d
和123.456D
都是double
类型。以 M
或m
结尾的实数字面量属于decimal
类型。例如,字面量1m
、1.5m
、1e10m
和123.456M
都是decimal
类型。该字面量通过采用精确值并在必要时使用银行家舍入(第4.1.7节)到最接近的可表示值来转换为十进制值。除非该值被舍入或者该值为零(此时符号和刻度将为0),否则任何明显的刻度都将保留。因此,字面量2.900m
将被解析为带有符号0
、系数2900
和刻度3
的十进制数。
如果您的变量不是short类型,您必须显式地进行强制类型转换:
Object s = (Int16) 1;
短整型没有简称,只需使用short s = 1;
。
short z1 = (0 == 1 ? 0 : 1);
但是这个不行:short y = 1; short z2 = (0 == 1 ? 0 : y);
(抱歉,注释中不允许换行) - yoyoz2
之前,if
语句中的0会被转换为int
。如果你在两个分支中使用两个short
,那么结果也将是一个short
。在使用if/else
语句时,编译器无法知道你的int
可以表示为short
。 - Olivervar myValue = unchecked((short)0x7F00);
字面值为int类型,因此必须转换为目标类型。 如果发生值溢出,则需要进行未经检查的操作。