今天早上的企鹅公司的实习笔试题。大家来讨论下!

时间:2021-10-25 18:55:27
第一题:signed char a=0xe0;

unsigned int b=a;

unsigned char c=a;

下面说法正确的是:

A (a>0 )&&(b>0)为真   B  c==a 为真  C b的16进制为0xffffffe0  D 都不对



第二题:int main()
{
  long long a=1;
  long long b=2;
  long long c=3;
  printf("%d,%d,%d",a,b ,c);
  return 0;

}
输出结果是什么?(32位环境,cpu为小端模式,所有参数用栈传递)


第三题:unsigned int a= 0x1234;
unsigned char b=*(unsigned char *)&a;
在32位大端模式处理器上变量b= ?。



希望大家给出详细点的分析。。分析好的我都会给分的。。希望大家多讨论!!

56 个解决方案

#1


大端模式:字数据的高字节存储在低地址中,而低字节存储在高地址中。
小端模式:字数据的高字节存储在高地址中,而低字节存储在低地址中。

这样楼主应该好理解了吧

#2


引用 1 楼 hai200501019 的回复:
大端模式:字数据的高字节存储在低地址中,而低字节存储在高地址中。
小端模式:字数据的高字节存储在高地址中,而低字节存储在低地址中。

这样楼主应该好理解了吧

c
1 0 2
0

#3


楼主面试感觉如何,难不难,会不会问很深的技术问题啊

#4


看了之后觉得自己基础太差

#5


怎么考的都是大小端啊。。

#6


1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小值, 所以3个long long在栈上是可以紧密排列的, 并且第一个long long对齐在sizeof(int)对齐内存地址.
3)栈地址向低增长, 函数参数入栈从右向左, 所以第一个long long是参数栈上最低地址的参数, 总共只需要1.5个long long就足以打印完3个%d. 
4)小端情况下, 第一个%d解释了第一个long long的低4字节, 打印1. 第二个%d解释了第一个long long的高4字节, 打印0. 第三个%d解释了第二个long long的低4字节, 打印2.

3, unsigned int a= 0x1234; 其中int是4字节, 补齐16进制表示为: 0x00 00 12 34
   unsigned char b=*(unsigned char *)&a; 由于大端存储, 所以上述int a变量的最低地址存储的是 
    十六进制表示中最左边的1字节, 为0x00.

#7


引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小……


第二条这个东西太鬼畜!不过我真心怀疑这个是企鹅的面试题。

#8


引用 2 楼 gdujian0119 的回复:
引用 1 楼 hai200501019 的回复:大端模式:字数据的高字节存储在低地址中,而低字节存储在高地址中。
小端模式:字数据的高字节存储在高地址中,而低字节存储在低地址中。

这样楼主应该好理解了吧
c
1 0 2
0

正解

#9


引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小……
好厉害呀。。。我真心不懂!!!!我晕。。。

#10


引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小……


讲的好。

#11


第二题还有谁能讲的再通俗点么??


另外第一题把a赋给b之后,unsigned int型的b的高位不是要用0补齐么?那这样的话b=0x 00 00 00 e0么?怎么会是0xffffffe0呢??

#12


引用 3 楼 hai200501019 的回复:
楼主面试感觉如何,难不难,会不会问很深的技术问题啊
还没有面试,只是简单的笔试。其实题目不难,对基础要求比较高,要理解比较深。。

#13


引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小……


第一题既然unsigned int 型在高位要补齐,不是用0补齐么?难道用1?解释下谢谢哈

#14


LZ笔试的是什么岗位啊?
对C语言要求很高么?

#15


引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小……


半懂半不懂,如果把%d改成%c,那么按道理一个long long可以打印完8个%c才对,
long long  a=0x3031323334353637;
printf("%c %c %c %c %c %c %c %c \n",a);
但是输出明显不正常,
输出第一个字符为7(0x37),第二个为3(0x33),后面的都是乱码了,
估计将a拆成了两个int,然后%c 读取了最低字节。
是不是只能拆成int?

#16


经典 今天早上的企鹅公司的实习笔试题。大家来讨论下!

#17


引用 11 楼 ccc43542876 的回复:
第二题还有谁能讲的再通俗点么??


另外第一题把a赋给b之后,unsigned int型的b的高位不是要用0补齐么?那这样的话b=0x 00 00 00 e0么?怎么会是0xffffffe0呢??
ls讲的很清楚了,有符号数扩宽填充符号位

#18


引用 17 楼 coming_from_mars 的回复:
引用 11 楼 ccc43542876 的回复:第二题还有谁能讲的再通俗点么??


另外第一题把a赋给b之后,unsigned int型的b的高位不是要用0补齐么?那这样的话b=0x 00 00 00 e0么?怎么会是0xffffffe0呢??ls讲的很清楚了,有符号数扩宽填充符号位
嗯,这题我搞懂了。。。自己绕住自己了。。

#19


引用 15 楼 a2659633 的回复:
引用 6 楼 qq120848369 的回复:1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐,……
就这个,我乱的不得了。。简直是不懂。。怪自己理解不到底,学的太差了

#20


引用 14 楼 hello_yz 的回复:
LZ笔试的是什么岗位啊?
对C语言要求很高么?
貌似技术类都是一套卷子就是c语言还有其它一些操作系统网络等题目。。。

#21


引用 13 楼 ccc43542876 的回复:
引用 6 楼 qq120848369 的回复:1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐,……

signed char a=0xe0 ;a是signed int 所以在内存中高位用符号位补齐,

#22


看来 我三题全错啊

#23


error C2632: 'long' followed by 'long' is illegal

呃呃呃
VC不支持long long???

#24


引用 7 楼 nadleeh123 的回复:
引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与si……



++

#25


引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小……


请教第一个问题。我印象中是这样的:

第一题:unsigned char a=0xe0;

 int b=a;

 char c=a;

下面说法正确的是:

A (a>0 )&&(b>0)为真   B  c==a 为真  C b的16进制为0xffffffe0  D 都不对

而且答案是不定选。

#26


门外汉表示看不懂。

#27


虽然工作几年了,我表示真心不会啊。
平时也不允许写这种代码,所以从没关心过这些细节。。

#28


第一题测试结果是b = EF;
汇编代码如下
00401032   mov         ecx,dword ptr [ebp-4]
00401035   and         ecx,0FFh
0040103B   mov         dword ptr [ebp-0Ch],ecx
可见没进行位扩展,而是高位补0
我的测试环境是VC6.0

#29


百度一下大小端。

#30


感觉挺难得,都是小细节的问题吧

#31


赞6楼的回复

#32


企鹅实习现在就开始笔试了啊

#33


第一题:signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;
下面说法正确的是:
A (a>0 )&&(b>0)为真   B  c==a 为真  C b的16进制为0xffffffe0  D 都不对
【分析】:
a = -16
c = 224
b = 0xffffffe0 (负数扩展前面补1)
c==a全部转化为int, -16 == 224 false
【答案】
C


第二题:int main()
{
  long long a=1;
  long long b=2;
  long long c=3;
  printf("%d,%d,%d",a,b,c);
  return 0;

}
输出结果是什么?(32位环境,cpu为小端模式,所有参数用栈传递)
【分析】:
传入参数,由右往左,栈空间内存从高往低,little endian, 栈空间如下:
内存高位->
00000000       00000011
00000000      [00000010](c)
[00000000](b) [00000001](a)
<-内存低位
因此printf会按照4bytes取参数. 
【答案】
输出: 1, 0, 2

第三题:unsigned int a= 0x1234;
unsigned char b=*(unsigned char *)&a;
在32位大端模式处理器上变量b= ?。
【分析】
bit endian CPU下面a的内存布局
内存低位->内存高位
00001234
b为0x00
【答案】
 b=0

个人感觉这几题对实习生是不是难了点, QQ不会吧真实招聘的题目随便拿来给实习生做了吧.

#34


引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小……


+1 还是版主猛啊

#35


引用 33 楼 youyou1912 的回复:
第一题:signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;
下面说法正确的是:
A (a>0 )&amp;&amp;(b>0)为真   B  c==a 为真  C b的16进制为0xffffffe0  D 都不对
【分析】:
a = -16
c = 224
b = 0xffffffe0 (负数扩……

第二题为什么访问a,b,c的时候是依次4个字节的在栈上读呢?为什么不是取a,b,c各自的地址后在再取4个字节呢?
对a的强制转换难道会影响到b吗?

#36


引用 35 楼 shimachao 的回复:
引用 33 楼 youyou1912 的回复:第一题:signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;
下面说法正确的是:
A (a>0 )&amp;amp;&amp;amp;(b>0)为真   B  c==a 为真  C b的16进制为0xffffffe0  D 都不对
【分析】:
a = -1……

变参调用只能是__cdecl调用协定. 具体理解就是由format string来决定的, %d的意思就是double word, 4字节. 
具体参考
http://blog.csdn.net/jiqiren007/article/details/6151640

#37


引用 1 楼 hai200501019 的回复:
大端模式:字数据的高字节存储在低地址中,而低字节存储在高地址中。
小端模式:字数据的高字节存储在高地址中,而低字节存储在低地址中。

这样楼主应该好理解了吧
第三题是不应该是18吗?

#38


引用 15 楼 a2659633 的回复:
引用 6 楼 qq120848369 的回复:1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐,……

你的系统要是64位的就除了第一个不是乱码,从第二个起(包含)就都是乱码。
原因建议看一下printf函数实现。

#39


哎~~ 基础不牢啊...

#40


。。。第二题在C++中不可能出现的,这让C++程序员好苦逼呀

#41


引用 14 楼 hello_yz 的回复:
LZ笔试的是什么岗位啊?
对C语言要求很高么?

技术类的都是这一份试卷

#42


基本正确,纠正下a=-32。


引用 33 楼 youyou1912 的回复:
第一题:signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;
下面说法正确的是:
A (a>0 )&amp;&amp;(b>0)为真   B  c==a 为真  C b的16进制为0xffffffe0  D 都不对
【分析】:
a = -16
c = 224
b = 0xffffffe0 (负数扩……

#43


引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小……


版主,我想问下,在实际应用中,这样的代码是在什么领域运用的?是改BUG还是会把这样的代码当成计算方式?只是想知道这样的面试题是真的会在实际中运用还是他们蛋疼

#44


第一题,考C/C++语言数据转换基本功:
signed char、unsigned char、signed int、unsigned int.... 强制转换的规则

第二题,考C语言最常用函数知识 输出格式化/变参/标准C函数调用协义

第三题,考大端/小端概念的理解:
unsigned int x = 0x00001234;
unsigned char *p = (unsigned char)&x;
if(*p==0x34) printf("小端");else printf("大端");

都是些基本功夫, 基本的概念和规则,资深C/C++程序员都懂的,初学和浅尝者则可能三个都不会.
都懂未必有多牛,都不懂则可说明很不合格,至少也属于C语言不及格的,不过第一题有25%的机率蒙对的.

#45


想说的是,面试的题目,实际项目中真的用不到,这种面试无异于现在的高考,体现不出个人的真实能力。


引用 44 楼 h_w_m 的回复:
第一题,考C/C++语言数据转换基本功:
signed char、unsigned char、signed int、unsigned int.... 强制转换的规则

第二题,考C语言最常用函数知识 输出格式化/变参/标准C函数调用协义

第三题,考大端/小端概念的理解:
unsigned int x = 0x00001234;
unsigned char ……

#46


引用 33 楼 youyou1912 的回复:
第一题:signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;
下面说法正确的是:
A (a>0 )&amp;&amp;(b>0)为真   B  c==a 为真  C b的16进制为0xffffffe0  D 都不对
【分析】:
a = -16
c = 224
b = 0xffffffe0 (负数扩……

老实说第一题和第三题真的应该做出来!第二题确实对我来说太难了点。。晓得是右向左压栈,可是为什么是取4个bytes呢?这点我也不懂。。。忘老大给更详细通俗的解。这题把我弄懂了,我就100分都给你了

#47


引用 44 楼 h_w_m 的回复:
第一题,考C/C++语言数据转换基本功:
signed char、unsigned char、signed int、unsigned int.... 强制转换的规则

第二题,考C语言最常用函数知识 输出格式化/变参/标准C函数调用协义

第三题,考大端/小端概念的理解:
unsigned int x = 0x00001234;
unsigned char ……
第一和第三应该对,,第二题有点难了

#48


引用 45 楼 xubo1210 的回复:
想说的是,面试的题目,实际项目中真的用不到,这种面试无异于现在的高考,体现不出个人的真实能力。


引用 44 楼 h_w_m 的回复:第一题,考C/C++语言数据转换基本功:
signed char、unsigned char、signed int、unsigned int.... 强制转换的规则

第二题,考C语言最常用函数知识 输出格式化/变参/标准C函……
我不是很同意你的说法,基础要牢固,不管有多牛,能力多强,基础不牢固总是不能发展久远的,除非心思不在技术。  个人理解。

#49


引用 46 楼 ccc43542876 的回复:
引用 33 楼 youyou1912 的回复:第一题:signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;
下面说法正确的是:
A (a>0 )&amp;amp;&amp;amp;(b>0)为真   B  c==a 为真  C b的16进制为0xffffffe0  D 都不对
【分析】:
a = -1……

变参调用只能是__cdecl调用协定. 具体理解就是由format string来决定的, %d的意思就是double word, 4字节. 
具体参考
http://blog.csdn.net/jiqiren007/article/details/6151640

#50


引用 49 楼 youyou1912 的回复:
引用 46 楼 ccc43542876 的回复:引用 33 楼 youyou1912 的回复:第一题:signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;
下面说法正确的是:
A (a>0 )&amp;amp;amp;&amp;amp;amp;(b>0)为真   B  c==a 为真  C b的16进制为……
谢谢了哈。。

#1


大端模式:字数据的高字节存储在低地址中,而低字节存储在高地址中。
小端模式:字数据的高字节存储在高地址中,而低字节存储在低地址中。

这样楼主应该好理解了吧

#2


引用 1 楼 hai200501019 的回复:
大端模式:字数据的高字节存储在低地址中,而低字节存储在高地址中。
小端模式:字数据的高字节存储在高地址中,而低字节存储在低地址中。

这样楼主应该好理解了吧

c
1 0 2
0

#3


楼主面试感觉如何,难不难,会不会问很深的技术问题啊

#4


看了之后觉得自己基础太差

#5


怎么考的都是大小端啊。。

#6


1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小值, 所以3个long long在栈上是可以紧密排列的, 并且第一个long long对齐在sizeof(int)对齐内存地址.
3)栈地址向低增长, 函数参数入栈从右向左, 所以第一个long long是参数栈上最低地址的参数, 总共只需要1.5个long long就足以打印完3个%d. 
4)小端情况下, 第一个%d解释了第一个long long的低4字节, 打印1. 第二个%d解释了第一个long long的高4字节, 打印0. 第三个%d解释了第二个long long的低4字节, 打印2.

3, unsigned int a= 0x1234; 其中int是4字节, 补齐16进制表示为: 0x00 00 12 34
   unsigned char b=*(unsigned char *)&a; 由于大端存储, 所以上述int a变量的最低地址存储的是 
    十六进制表示中最左边的1字节, 为0x00.

#7


引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小……


第二条这个东西太鬼畜!不过我真心怀疑这个是企鹅的面试题。

#8


引用 2 楼 gdujian0119 的回复:
引用 1 楼 hai200501019 的回复:大端模式:字数据的高字节存储在低地址中,而低字节存储在高地址中。
小端模式:字数据的高字节存储在高地址中,而低字节存储在低地址中。

这样楼主应该好理解了吧
c
1 0 2
0

正解

#9


引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小……
好厉害呀。。。我真心不懂!!!!我晕。。。

#10


引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小……


讲的好。

#11


第二题还有谁能讲的再通俗点么??


另外第一题把a赋给b之后,unsigned int型的b的高位不是要用0补齐么?那这样的话b=0x 00 00 00 e0么?怎么会是0xffffffe0呢??

#12


引用 3 楼 hai200501019 的回复:
楼主面试感觉如何,难不难,会不会问很深的技术问题啊
还没有面试,只是简单的笔试。其实题目不难,对基础要求比较高,要理解比较深。。

#13


引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小……


第一题既然unsigned int 型在高位要补齐,不是用0补齐么?难道用1?解释下谢谢哈

#14


LZ笔试的是什么岗位啊?
对C语言要求很高么?

#15


引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小……


半懂半不懂,如果把%d改成%c,那么按道理一个long long可以打印完8个%c才对,
long long  a=0x3031323334353637;
printf("%c %c %c %c %c %c %c %c \n",a);
但是输出明显不正常,
输出第一个字符为7(0x37),第二个为3(0x33),后面的都是乱码了,
估计将a拆成了两个int,然后%c 读取了最低字节。
是不是只能拆成int?

#16


经典 今天早上的企鹅公司的实习笔试题。大家来讨论下!

#17


引用 11 楼 ccc43542876 的回复:
第二题还有谁能讲的再通俗点么??


另外第一题把a赋给b之后,unsigned int型的b的高位不是要用0补齐么?那这样的话b=0x 00 00 00 e0么?怎么会是0xffffffe0呢??
ls讲的很清楚了,有符号数扩宽填充符号位

#18


引用 17 楼 coming_from_mars 的回复:
引用 11 楼 ccc43542876 的回复:第二题还有谁能讲的再通俗点么??


另外第一题把a赋给b之后,unsigned int型的b的高位不是要用0补齐么?那这样的话b=0x 00 00 00 e0么?怎么会是0xffffffe0呢??ls讲的很清楚了,有符号数扩宽填充符号位
嗯,这题我搞懂了。。。自己绕住自己了。。

#19


引用 15 楼 a2659633 的回复:
引用 6 楼 qq120848369 的回复:1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐,……
就这个,我乱的不得了。。简直是不懂。。怪自己理解不到底,学的太差了

#20


引用 14 楼 hello_yz 的回复:
LZ笔试的是什么岗位啊?
对C语言要求很高么?
貌似技术类都是一套卷子就是c语言还有其它一些操作系统网络等题目。。。

#21


引用 13 楼 ccc43542876 的回复:
引用 6 楼 qq120848369 的回复:1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐,……

signed char a=0xe0 ;a是signed int 所以在内存中高位用符号位补齐,

#22


看来 我三题全错啊

#23


error C2632: 'long' followed by 'long' is illegal

呃呃呃
VC不支持long long???

#24


引用 7 楼 nadleeh123 的回复:
引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与si……



++

#25


引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小……


请教第一个问题。我印象中是这样的:

第一题:unsigned char a=0xe0;

 int b=a;

 char c=a;

下面说法正确的是:

A (a>0 )&&(b>0)为真   B  c==a 为真  C b的16进制为0xffffffe0  D 都不对

而且答案是不定选。

#26


门外汉表示看不懂。

#27


虽然工作几年了,我表示真心不会啊。
平时也不允许写这种代码,所以从没关心过这些细节。。

#28


第一题测试结果是b = EF;
汇编代码如下
00401032   mov         ecx,dword ptr [ebp-4]
00401035   and         ecx,0FFh
0040103B   mov         dword ptr [ebp-0Ch],ecx
可见没进行位扩展,而是高位补0
我的测试环境是VC6.0

#29


百度一下大小端。

#30


感觉挺难得,都是小细节的问题吧

#31


赞6楼的回复

#32


企鹅实习现在就开始笔试了啊

#33


第一题:signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;
下面说法正确的是:
A (a>0 )&&(b>0)为真   B  c==a 为真  C b的16进制为0xffffffe0  D 都不对
【分析】:
a = -16
c = 224
b = 0xffffffe0 (负数扩展前面补1)
c==a全部转化为int, -16 == 224 false
【答案】
C


第二题:int main()
{
  long long a=1;
  long long b=2;
  long long c=3;
  printf("%d,%d,%d",a,b,c);
  return 0;

}
输出结果是什么?(32位环境,cpu为小端模式,所有参数用栈传递)
【分析】:
传入参数,由右往左,栈空间内存从高往低,little endian, 栈空间如下:
内存高位->
00000000       00000011
00000000      [00000010](c)
[00000000](b) [00000001](a)
<-内存低位
因此printf会按照4bytes取参数. 
【答案】
输出: 1, 0, 2

第三题:unsigned int a= 0x1234;
unsigned char b=*(unsigned char *)&a;
在32位大端模式处理器上变量b= ?。
【分析】
bit endian CPU下面a的内存布局
内存低位->内存高位
00001234
b为0x00
【答案】
 b=0

个人感觉这几题对实习生是不是难了点, QQ不会吧真实招聘的题目随便拿来给实习生做了吧.

#34


引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小……


+1 还是版主猛啊

#35


引用 33 楼 youyou1912 的回复:
第一题:signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;
下面说法正确的是:
A (a>0 )&amp;&amp;(b>0)为真   B  c==a 为真  C b的16进制为0xffffffe0  D 都不对
【分析】:
a = -16
c = 224
b = 0xffffffe0 (负数扩……

第二题为什么访问a,b,c的时候是依次4个字节的在栈上读呢?为什么不是取a,b,c各自的地址后在再取4个字节呢?
对a的强制转换难道会影响到b吗?

#36


引用 35 楼 shimachao 的回复:
引用 33 楼 youyou1912 的回复:第一题:signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;
下面说法正确的是:
A (a>0 )&amp;amp;&amp;amp;(b>0)为真   B  c==a 为真  C b的16进制为0xffffffe0  D 都不对
【分析】:
a = -1……

变参调用只能是__cdecl调用协定. 具体理解就是由format string来决定的, %d的意思就是double word, 4字节. 
具体参考
http://blog.csdn.net/jiqiren007/article/details/6151640

#37


引用 1 楼 hai200501019 的回复:
大端模式:字数据的高字节存储在低地址中,而低字节存储在高地址中。
小端模式:字数据的高字节存储在高地址中,而低字节存储在低地址中。

这样楼主应该好理解了吧
第三题是不应该是18吗?

#38


引用 15 楼 a2659633 的回复:
引用 6 楼 qq120848369 的回复:1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐,……

你的系统要是64位的就除了第一个不是乱码,从第二个起(包含)就都是乱码。
原因建议看一下printf函数实现。

#39


哎~~ 基础不牢啊...

#40


。。。第二题在C++中不可能出现的,这让C++程序员好苦逼呀

#41


引用 14 楼 hello_yz 的回复:
LZ笔试的是什么岗位啊?
对C语言要求很高么?

技术类的都是这一份试卷

#42


基本正确,纠正下a=-32。


引用 33 楼 youyou1912 的回复:
第一题:signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;
下面说法正确的是:
A (a>0 )&amp;&amp;(b>0)为真   B  c==a 为真  C b的16进制为0xffffffe0  D 都不对
【分析】:
a = -16
c = 224
b = 0xffffffe0 (负数扩……

#43


引用 6 楼 qq120848369 的回复:
1, 整形比较小于int的会扩宽的int再比较, 而有符号数扩宽填充符号位, 无符号数填充0, 导致扩宽后两个整形的二进制不再相等, 选择C.

2, 
1)无论32/64, long long都是8字节整形, %d会将参数栈上的内存解释为4字节int, 所以会造成打印结果异常.
2)由于任何多字节变量都要做内存对齐, 原则是自身长度与sizeof(int)间较小……


版主,我想问下,在实际应用中,这样的代码是在什么领域运用的?是改BUG还是会把这样的代码当成计算方式?只是想知道这样的面试题是真的会在实际中运用还是他们蛋疼

#44


第一题,考C/C++语言数据转换基本功:
signed char、unsigned char、signed int、unsigned int.... 强制转换的规则

第二题,考C语言最常用函数知识 输出格式化/变参/标准C函数调用协义

第三题,考大端/小端概念的理解:
unsigned int x = 0x00001234;
unsigned char *p = (unsigned char)&x;
if(*p==0x34) printf("小端");else printf("大端");

都是些基本功夫, 基本的概念和规则,资深C/C++程序员都懂的,初学和浅尝者则可能三个都不会.
都懂未必有多牛,都不懂则可说明很不合格,至少也属于C语言不及格的,不过第一题有25%的机率蒙对的.

#45


想说的是,面试的题目,实际项目中真的用不到,这种面试无异于现在的高考,体现不出个人的真实能力。


引用 44 楼 h_w_m 的回复:
第一题,考C/C++语言数据转换基本功:
signed char、unsigned char、signed int、unsigned int.... 强制转换的规则

第二题,考C语言最常用函数知识 输出格式化/变参/标准C函数调用协义

第三题,考大端/小端概念的理解:
unsigned int x = 0x00001234;
unsigned char ……

#46


引用 33 楼 youyou1912 的回复:
第一题:signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;
下面说法正确的是:
A (a>0 )&amp;&amp;(b>0)为真   B  c==a 为真  C b的16进制为0xffffffe0  D 都不对
【分析】:
a = -16
c = 224
b = 0xffffffe0 (负数扩……

老实说第一题和第三题真的应该做出来!第二题确实对我来说太难了点。。晓得是右向左压栈,可是为什么是取4个bytes呢?这点我也不懂。。。忘老大给更详细通俗的解。这题把我弄懂了,我就100分都给你了

#47


引用 44 楼 h_w_m 的回复:
第一题,考C/C++语言数据转换基本功:
signed char、unsigned char、signed int、unsigned int.... 强制转换的规则

第二题,考C语言最常用函数知识 输出格式化/变参/标准C函数调用协义

第三题,考大端/小端概念的理解:
unsigned int x = 0x00001234;
unsigned char ……
第一和第三应该对,,第二题有点难了

#48


引用 45 楼 xubo1210 的回复:
想说的是,面试的题目,实际项目中真的用不到,这种面试无异于现在的高考,体现不出个人的真实能力。


引用 44 楼 h_w_m 的回复:第一题,考C/C++语言数据转换基本功:
signed char、unsigned char、signed int、unsigned int.... 强制转换的规则

第二题,考C语言最常用函数知识 输出格式化/变参/标准C函……
我不是很同意你的说法,基础要牢固,不管有多牛,能力多强,基础不牢固总是不能发展久远的,除非心思不在技术。  个人理解。

#49


引用 46 楼 ccc43542876 的回复:
引用 33 楼 youyou1912 的回复:第一题:signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;
下面说法正确的是:
A (a>0 )&amp;amp;&amp;amp;(b>0)为真   B  c==a 为真  C b的16进制为0xffffffe0  D 都不对
【分析】:
a = -1……

变参调用只能是__cdecl调用协定. 具体理解就是由format string来决定的, %d的意思就是double word, 4字节. 
具体参考
http://blog.csdn.net/jiqiren007/article/details/6151640

#50


引用 49 楼 youyou1912 的回复:
引用 46 楼 ccc43542876 的回复:引用 33 楼 youyou1912 的回复:第一题:signed char a=0xe0;
unsigned int b=a;
unsigned char c=a;
下面说法正确的是:
A (a>0 )&amp;amp;amp;&amp;amp;amp;(b>0)为真   B  c==a 为真  C b的16进制为……
谢谢了哈。。