第一次面试成都某游戏公司时的题目

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/WJSZMD/article/details/80218727

首先笔试,较为基础,其中最后有一道关于游戏开发题目

  • 总共23根火柴,人和计算机只能拿其中的1 2 3 根,谁拿到最后一根谁就输,编程实现该游戏。

设计模式

  • 谈谈熟悉的一种设计模式,并用例子说明。

TCP/IP协议

  • 谈谈TCP三次握手。

面试问的较为底层

1.浮点数类型在计算机中如何存储的
答:对于浮点数类型采用单精度float类型,和双精度类型double,还有扩展精度浮点数long double来存储,float数据最小尺寸为6位有效数字,double和long double都为10位有效数字。通常float以1个字(32bit),double以2个字(64bit),long double以3或者4个字来表示。
而无论单精度还是双精度,在存储时都有三个部分:
- 符号位:0代表正,1代表负
- 指数位:用于存储科学计数法中的指数数据,并且采用移位存储
- 尾数部分:尾数部分

float存储方式为:
float

double存储方式为:
double

举个例子120.5用二进制表示为1110110.1,那么用二进制的科学表示法可以表示为1.1101101*2^6,即任何一个数都可以科学表示为1.xxx* 2^n, 尾数部分就可以表示为xxxx,第一位都是1嘛,干嘛还要表示呀?可以将小数点前面的1省略,所以尾数部分表示的都是小数点之后的数;对于指数部分,指数可正可负,即8位二进制可表示-127+128,值得注意的是指数部分采用移位存储,即要存储的值都加上+127。

我们看看8.5和120.5真正的存储方式:
8.5=1.0001*2^3
符号位为0,代表正数,指数位为3+127=130,尾数部分为0001,则:
8.5

120.5=1.1101101*2^6
符号位为0,代表正数,指数位为6+127=133,尾数部分为1101101,则:
120.5

float和double的取值范围和精度:

取值范围看指数部分:
float是有符号型,其中,8位指数位,2^8=(-128—127),因此实际的范围是-2^128—2^127,约为-3.4E38—3.4E38
同理double范围约是-1.7E308—1.7E308,

精度是看尾数部分:
float尾数位23位,2^23=8.3E6,7位,所以不同的编译器规定不同,有些是7位,有些8位
double尾数52位,2^52=4.5E15,15位,所以double的有效位数是15位

还有个问题是由于小数点之前都省略了1,所以不管小数点之前的1,那么对于float的0.0和1.0怎样区分呢?
实际上0.0为00000000000000000000000000000000 32个0
1.0 则是 0011 1111 1000 0000 0000 0000 0000 0000

2.c++中的多线程

3.指针和引用的不同点
答:第一点指针本身就是一个对象,允许对指针赋值和拷贝,而且指针在他的生命周期内可以先后指向几个不同的对象,而引用不是一个对象,它只是为一个已经存在的对象所起的另外一个名字,故不能定义引用的引用。并且初试化一旦完成,它就一直和初始值对象绑定在一起。
第二点指针无需在定义时赋初值,而引用必须初始化。

4.如何引用全局变量
5.TCP协议中的拥塞和流量控制
6.操作系统的进程调度算法
7.数据库中合并两张表时的笛卡尔集

展开阅读全文

没有更多推荐了,返回首页