C# 试题 02:数值类型与转换
0021 以下代码输出什么?
难度: 实战
int big = 16_777_217;
float f = big;
Console.WriteLine(f == big);
- A.
True,float能无损表示所有int - B.
False,float尾数只有 24 位有效二进制位,16_777_217被舍入 - C. 编译失败,
int不能隐式转换为float - D. 运行抛
OverflowException
查看答案与解析
正确答案B
解析: int 到 float 是隐式转换,但 float 尾数只有 24 位;16_777_217(2²⁴+1)无法精确表示,舍入为 16_777_216,比较为 False。
关键点: 隐式转换不一定无损,整数转浮点会丢精度。
0022 在默认(unchecked)上下文,以下代码输出什么?
难度: 实战
long l = 3_000_000_000L;
int i = (int)l;
Console.WriteLine(i);
- A. 编译失败,
long不能转换为int - B. 运行抛
OverflowException - C. 输出
3000000000 - D. 输出
-1294967296,高位被截断后按补码解释
查看答案与解析
正确答案D
解析: unchecked 下显式窄化直接截断高位:3_000_000_000 的低 32 位 0xB2D05E00 按有符号 int 解释为 -1_294_967_296。
关键点: 显式转换不保证值落在目标范围内。
0023 以下代码运行结果是什么?
难度: 进阶
int x = int.MaxValue;
checked
{
x++;
}
Console.WriteLine(x);
- A. 运行抛
OverflowException - B. 输出
-2147483648 - C. 编译失败
- D. 输出
2147483647
查看答案与解析
正确答案A
解析: checked 块中的整数运算溢出时抛 OverflowException;int.MaxValue + 1 必然溢出。
关键点: checked 把静默回绕变成异常。
0024 项目未开启全局 checked,以下代码输出什么?
难度: 进阶
int x = int.MaxValue;
x++;
Console.WriteLine(x);
- A. 运行抛
OverflowException - B. 输出
-2147483648,默认 unchecked 语义下静默回绕 - C. 编译失败
- D. 输出
2147483647
查看答案与解析
正确答案B
解析: 默认算术上下文是 unchecked,运行时溢出直接回绕:int.MaxValue + 1 变成 int.MinValue。
关键点: 与上一题对比,是否有 checked 决定行为。
0025 以下代码输出什么?
难度: 进阶
Console.WriteLine(-7 / 2);
Console.WriteLine(-7 % 2);
- A.
-3和-1,整数除法向零截断,余数符号与被除数一致 - B.
-4和-1 - C.
-3和1 - D.
-4和1
查看答案与解析
正确答案A
解析: C# 整数除法向零截断:-7 / 2 = -3(不是向下取整的 -4);% 结果的符号与被除数一致,-7 % 2 = -1。这与 Python 等向下取整的语言不同。
关键点: 跨语言迁移时最容易踩的坑之一。
0026 关于 double 与 decimal 的除零行为,哪项正确?
难度: 进阶
- A. 两者都会抛
DivideByZeroException - B.
double除零得到Infinity/NaN,decimal除零抛DivideByZeroException - C. 两者都得到
Infinity - D.
decimal除零得到0
查看答案与解析
正确答案B
解析: double 遵循 IEEE 754:正数除零得 +Infinity,0.0/0.0 得 NaN;decimal 没有 Infinity/NaN 概念,除零抛异常。
关键点: 浮点与十进制的异常语义不同。
0027 以下代码输出什么?
难度: 实战
Console.WriteLine(int.TryParse(null, out int n) + " " + n);
Console.WriteLine(int.TryParse("", out int m) + " " + m);
- A. 两行都输出
False 0,TryParse对null和空串不抛异常 - B. 第一行抛
ArgumentNullException - C. 两行都输出
True 0 - D. 第二行抛
FormatException
查看答案与解析
正确答案A
解析: TryParse 的输入参数是可空引用类型,null 与空串都按解析失败处理:返回 false,out 值置为 0,不抛异常。
关键点: TryParse 对边界输入是“全失败不抛异常”语义。
0028 以下代码运行结果是什么?
难度: 进阶
int n = int.Parse("2147483648");
Console.WriteLine(n);
- A. 运行抛
FormatException - B. 返回
2147483648 - C. 运行抛
OverflowException,数字格式合法但超出int范围 - D. 返回
0
查看答案与解析
正确答案C
解析: 输入是合法数字格式,但 2_147_483_648 比 int.MaxValue 大 1,触发 OverflowException;格式错误才抛 FormatException。
关键点: 区分 FormatException 与 OverflowException 是常见考点。
0029 以下代码输出什么?
难度: 实战
int a = 100_000;
int b = a * a / a;
Console.WriteLine(b);
- A.
100000 - B. 编译失败
- C. 运行抛
OverflowException - D.
14100,a * a中间结果溢出回绕后再做除法
查看答案与解析
正确答案D
解析: 默认 unchecked 下 100_000 * 100_000 = 10^10 溢出,截断为 1_410_065_408,再除以 100_000 得 14100;每一步都是 int 运算。
关键点: 中间结果溢出比最终结果溢出更隐蔽,必要时提升为 long。
0030 以下代码输出什么?
难度: 进阶
double a = 0.1;
double b = 0.2;
Console.WriteLine(a + b == 0.3);
- A.
True - B. 编译失败
- C.
False,0.1 + 0.2实际是0.30000000000000004 - D. 运行抛异常
查看答案与解析
正确答案C
解析: 0.1、0.2、0.3 都无法用二进制浮点精确表示,0.1 + 0.2 为 0.30000000000000004,与 0.3 不相等。
关键点: 精确十进制场景用 decimal。
0031 把上一题换成 decimal,以下代码输出什么?
难度: 进阶
decimal a = 0.1m;
decimal b = 0.2m;
Console.WriteLine(a + b == 0.3m);
- A.
True,decimal精确表示十进制小数 - B.
False - C. 编译失败
- D. 运行抛异常
查看答案与解析
正确答案A
解析: decimal 以十进制存储(28~29 位有效数字),0.1m + 0.2m 精确等于 0.3m。
关键点: decimal 精度语义符合十进制直觉,但范围小于 double。
0032 财务金额计算应优先选择哪种类型?
难度: 实战
- A.
double,运算性能最好 - B.
float,内存占用最小 - C.
decimal,十进制语义可避免二进制舍入误差 - D. 任意类型结果都相同
查看答案与解析
正确答案C
解析: 金额需要精确的十进制表示,decimal 是标准选择;double/float 适合科学计算等对十进制精确性要求不高的场景。
关键点: 选型依据是“精确十进制”还是“范围/性能”。
0033 以下代码运行结果是什么?
难度: 实战
decimal third = 1m / 3m;
Console.WriteLine(third);
- A. 运行抛
DivideByZeroException - B. 输出
0.3333333333333333333333333333,按decimal精度舍入,不抛异常 - C. 输出
0.33 - D. 编译失败
查看答案与解析
正确答案B
解析: decimal 除法按 28~29 位有效数字舍入到最近的十进制表示,不会抛异常(除零除外)。
关键点: decimal 除法有确定舍入规则,精确分数仍需自定舍入策略。
0034 以下代码输出什么?
难度: 进阶
char c = 'A';
Console.WriteLine(c + 1);
Console.WriteLine((char)(c + 1));
- A.
66和B,char参与算术时提升为int - B.
65和B - C.
'A'和B - D. 编译失败
查看答案与解析
正确答案A
解析: char + int 中 char 提升为 int,'A' + 1 是数值 66;显式转回 char 才得到字符 'B'。
关键点: char 的算术结果是 int 而不是 char。
0035 关于 int.Parse("123") 与 (int)"123",哪项正确?
难度: 进阶
- A. 两者等价
- B.
Parse解析字符串内容;强制转换要求类型之间存在转换关系,string到int不适用,(int)"123"无法编译 - C. 强制转换总是成功且更高效
- D. 两者都会抛
OverflowException
查看答案与解析
正确答案B
解析: 强制转换处理继承或数值窄化;字符串到数值必须通过 Parse、TryParse 或 Convert。
关键点: “(int)” 不等于“解析字符串”。
0036 以下代码输出什么?
难度: 实战
byte b = 200;
byte c = (byte)(b + b);
Console.WriteLine(c);
- A.
400 - B. 编译失败
- C.
144,400截断到byte只保留低 8 位 - D. 运行抛
OverflowException
查看答案与解析
正确答案C
解析: b + b 提升为 int(400),显式转回 byte 时按 unchecked 语义截断:400 mod 256 = 144。
关键点: 窄化转换取低位,数值会“回绕”。
0037 以下代码输出什么?
难度: 进阶
double d = 0.1;
float f = (float)d;
Console.WriteLine(f == d);
- A.
True - B.
False,float精度低于double,两者二进制表示不同 - C. 编译失败
- D. 运行抛异常
查看答案与解析
正确答案B
解析: 0.1 在 double 和 float 中的舍入值不同;比较时 f 提升回 double,但数值已经不是原来的 0.1d,结果为 False。
关键点: 跨精度直接判等不可靠。
0038 在 unchecked 上下文,以下代码输出什么?
难度: 实战
unchecked
{
int x = int.MaxValue + 1;
Console.WriteLine(x);
}
- A. 输出
-2147483648 - B. 运行抛
OverflowException - C. 编译失败,常量表达式溢出
- D. 输出
0
查看答案与解析
正确答案A
解析: 常量表达式默认按 checked 语义检查,但 unchecked 上下文允许溢出回绕,int.MaxValue + 1 得到 int.MinValue。
关键点: 与 0023/0024 的运行时溢出对比,这里控制的是编译期常量。
0039 以下各字面量的类型,哪项说法正确?
难度: 进阶
var a = 1_000;
var b = 0x10;
var c = 3_000_000_000;
var d = 1e3;
var e = 1.5m;
- A.
c是long,d是double - B.
c是uint,d是double,e是decimal - C.
b是long - D.
e是double
查看答案与解析
正确答案B
解析: 无后缀整数按 int → uint → long → ulong 顺序取第一个能容纳的类型:3_000_000_000 超 int 范围但小于 uint 上限,所以是 uint;1e3 是指数形式,为 double。
关键点: “超 int 就是 long”是常见误解,实际先落到 uint。
0040 以下代码运行结果是什么?
难度: 实战
Console.WriteLine(int.Parse("4 2"));
Console.WriteLine(int.Parse(" 42 "));
- A. 两行都输出
42 - B. 第一行抛
FormatException,第二行输出42;默认NumberStyles.Integer允许首尾空白但不允许内部空格 - C. 两行都抛
FormatException - D. 第一行输出
4,第二行输出42
查看答案与解析
正确答案B
解析: int.Parse 默认使用 NumberStyles.Integer,允许前导/尾随空白和符号,但内部空格不是合法数字格式,抛 FormatException。
关键点: 用户输入应先用 TryParse 或指定明确的 NumberStyles 与 CultureInfo。