笔试题两道

昨天师兄去参加笔试,回来和我探讨了几题蛮有意思的,现在贴上来两题分享一下。

第一题

char c = 0xff;   // 1111 1111
printf("%d",c);  //以整数形式输出

有人直接写出是255,其实这是没有深入去研究,我也会经常犯这种错误;

下面我们仔细来探讨下,char是八位的有符号的,所以他的大小范围是在   -128~127  ,然本体我们说255必然是错的了;如果换位unsigned char的话,那么输出255肯定是对的。

下面我们探讨答案是多少,有些人可能直接转化为负数 -127,这些人是木有搞懂存放机制,负数在内存在是以补码的形式出现的

所以这题真正的答案是 -1。

在这里提一下补码——》数值的转化有两种:

1)减一取反(这是逆向思维,因为得到补码是取反加一);

2)加一取反

第二种方法我们要讲一下。

参考:http://blog.csdn.net/studyvcmfc/article/details/7606292

有:源码=【【源码】补码】补码

这种方法在计算上会避免调用一些进位,会省掉很多事情,虽然前一中也很简单,但还是推荐这种。

注:这种方法其实是师兄力荐的,我开始是反对的,后来被说服了。

第二题

描述:我们知道有一个存储学生信息的结构体,但我们不知道结构体内具体包含哪些信息,尽管如此,我们了解到学生信息结合体重包含了一个电话号码字段,如下

struct student
{
    ....
    int mobile_number;
    ....
}SStudent;

请用c++表达式计算出mobile_number在SStudent中的偏移量。

首先我们要了解偏移量,计算机汇编语言中的偏移量定义为:把存储单元的实际地址与其所在段的段地址之间的距离称为段内偏移,也称为“有效地址或偏移量”。

了解之后我们就可以写出代码了,其实代码很简单。

(unsigned int)(&((SStudent*)0)->mobile_number);

这一行代码就可以实现出来,下面我们来进行解释。参考其他大神的解释。

引用:http://blog.csdn.net/niu91/article/details/17881773

1.(struct*)0          表示将常量0强制转化为struc*型指针所指向的地址,这里0位起始地址的值,如果换成其他数值,后面的也相应改变。已测过。为了更好地算出偏移量,取0是很好的方法

2.&(((struct*)0)->e)   表示取结构体指针(struc*)0的成员e的地址

3.强制转换为 unsigned int型。

由于上面提到0是可以改变的所以还有一种方法:(unsigned int)(&((SStudent*)1000)->mobile_number) - (unsigned int)((SStudent*)1000);//(1000是任意取得)

总结:c/c++还有很多机制让我去发现,昨天真的有多了解了一点。其实考题并不难,知道一点就稍微能作对一点,所以应付这种题目,还是要好好看书。

时间: 2024-10-07 05:45:26

笔试题两道的相关文章

c++笔试题两道,求解当中一道

1.Implement a functionthat prints the numbers from 1 to 100.But for multiples of three(3) print "Zif"insteadof the number and for the multiples of five(5) print "Nab". For numbers whichare multiples of both three and five print "Z

c++笔试题两道,求解其中一道

1.Implement a functionthat prints the numbers from 1 to 100.But for multiples of three(3) print "Zif"insteadof the number and for the multiples of five(5) print "Nab". For numbers whichare multiples of both three and five print "Z

百度脚本笔试题两道

1.写脚本实现,可以用shell.perl等.在目录/tmp下找到100个以abc开头的文件,然后把这些文件的第一行保存到文件new中. 2.写脚本实现,可以用shell.perl等.把文件b中有的,但是文件a中没有的所有行,保存为文件c,并统计c的行数. 解答思路: 1:觉得用shell更好一些,代码如下 #!/bin/sh for filename in `find /tmp -type f -name "abc*"|head -n 100` do sed -n '1p' $fil

[笔试题] 两个有趣的问题

有n瓶粉末,一瓶有毒.有毒的粉末融在水里一小时后水会变蓝.你有一些试管,问最少需要多少时间和多少试管就能确定毒粉末呢?不考虑粉末导入试管的时间. 这道题最基本的想法就是时间换空间或者空间换时间,即n个试管用1小时的时间,或者1个试管用n小时依次试验过来.在实际生产中应该偏向于空间换时间,因为硬性资源可以增加,而程序如果找不到好的优化方法运行时间基本也就定了,所以时间比空间重要的多.但是这两个显然都不是什么好办法.另外一个比较好的解决办法就是二分,把瓶子分两组,花一个小时排除掉一半的瓶子,再花一个

经典笔试题:两个线程交替打印奇偶数

一.采用对象的wait() notify()方法实现 package com.gaopeng.programming; import java.util.concurrent.TimeUnit; /** * 经典笔试题:交替打印奇偶数 采用对象的wait() notify()方法实现 * * @author gaopeng * */ public class OddEvenThread { private static volatile Integer counter = 0; public s

传说中的华为Python笔试题——两等长整数序列互换元素,序列和的差值最小(修正)

有两个序列a,b,大小都为n,序列元素的值任意整形数,无序:要求:通过交换a,b中的元素,使[序列a元素的和]与[序列b元素的和]之间的差最小. 1. 将两序列合并为一个序列,并排序,得到sourceList2. 拿出最大元素Big,次大的元素Small3. 在余下的序列S[:-2]进行平分,得到序列max,min4. 将Small加到max序列,将Big加大min序列,重新计算新序列和,和大的为max,小的为min. 如下,提供递归版本和迭代版本的解体思路: #!/usr/bin/env py

Linux运维工程师经典笔试题30道

1. cat -n file1 file2 命令的意思是? 把文件file1和file2连在一起,然后输出到屏幕上. 2. Linux下查看服务程序占用的端口命令是什么? netstat –apn 3. 对于Linux说法,下列说法正确的是() 线性访问内存非法时,当前线程会进入信号处理函数 4. 在Linux系统上,下面那个命令不可以用来查看文件内容() A cat    B ls     C less   D more 5. 下面哪个命令可以从文本文件的每一行中截取指定内容的数据. A cp

告诉我图样图森破的两道简单C++笔试题

今晚刷了一大堆的笔试题,中规中矩,但是有两道做得很快但是都错了的题目,印象深刻. (要找工作的大四渣有没有共鸣,在学校明明很努力,但是总是跟不上时代,没有厉害的项目,也没有过人的竞赛成绩,内推屡屡失败,前天阿里巴巴在线笔试也被虐死,真心迷惘,唯独刷题搞笔试了.) 第一道题是关于宏定义的. #include<iostream> using namespace std; #define fun(n) (n-1)*n int main() { int x=3; cout<<fun(x+3

两道笔试题的感触

今天做了两道笔试题,收益良多.有些题,你会发现,虽然并不难,但是却很容易没有思路或者出错,这都是源自平时的不求甚解.很多知识点,自以为已经掌握,其实只是管中窥豹,可见一斑.不要一味墨守成规,也要用于思考,很多东西既要知其然,也要知其所以然.我一直觉得了解和精通中间差着十万八千里,看来还有很长一段路要走.只有比别人更早.更勤奋地努力,才能尝到更加成功的滋味.哈哈,跑题了. 下面看一下两道笔试题.一.大概简单地说一下,求下面这段代码的结果. new Thread(new Runnable() { p