整数类型笔试题常见考点解析
找工作面试写代码,绕不开数据类型,尤其是整数类型。别看它基础,真到笔试的时候,一个 int 占几个字节、long 和 long long 有啥区别,可能就卡住了。
很多公司喜欢在笔试题里埋坑,比如给你一段 C++ 代码,问输出结果是多少。表面上是考循环或条件判断,实际上是在考你对整数范围和溢出的理解。
常见的整数类型及其取值范围
在 32 位或 64 位系统中,C/C++ 中的整数类型大小并不完全一样。下面是一般情况下的取值范围:
int: 4 字节,范围 -2,147,483,648 到 2,147,483,647
unsigned int: 4 字节,范围 0 到 4,294,967,295
long: 在 Windows 下通常 4 字节,在 Linux 64 位下是 8 字节
long long: 8 字节,范围 -9,223,372,036,854,775,808 到 9,223,372,036,854,775,807
short: 2 字节,范围 -32,768 到 32,767注意:long 的大小依赖平台,这是笔试常设陷阱的地方。比如一道题在 Linux 环境下运行结果正确,换到 Windows 可能就出错。
整数溢出问题经常被拿来出题
比如下面这段代码:
int a = 2147483647;
a += 1;
printf("%d\n", a);你以为会报错?不会。它会正常输出 -2147483648。这就是典型的符号位翻转导致的整数溢出。这种题在笔试中一出,没注意的人直接掉坑里。
还有一种是无符号整数的回绕:
unsigned int b = 0;
b--;
printf("%u\n", b);结果不是 -1,而是 4294967295。因为无符号类型不能为负,减 1 就会绕到最大值。
不同类型之间的比较也要小心
下面这个例子很经典:
if (-1 < unsigned(1))
printf("true\n");
else
printf("false\n");看起来 -1 当然小于 1,但输出的是 false。原因在于 -1 被自动转成 unsigned int,变成了 4294967295,当然大于 1。
这类题目考察的是“有符号与无符号比较时的隐式类型转换”,是笔试高频考点。
Java 中的整数类型相对固定
不像 C++ 那样受平台影响,Java 的整数类型大小是固定的:
byte: 1 字节
short: 2 字节
int: 4 字节
long: 8 字节(写数字时要加 L,如 123L)所以 Java 笔试题更侧重包装类和自动拆装箱,比如 Integer 缓存池的问题,但基础整数运算溢出也常考。
比如:
int x = Integer.MAX_VALUE;
int y = Integer.MAX_VALUE;
int z = x + y;
System.out.println(z); // 输出 -2加法溢出后变成负数,不了解的人还以为算错了。
准备笔试时,别光刷算法题,回头把整数类型的细节过一遍。很多时候,决定你能不能进下一轮的,就是这些看着不起眼的知识点。