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
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.
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
第二条这个东西太鬼畜!不过我真心怀疑这个是企鹅的面试题。
#8
正解
#9
好厉害呀。。。我真心不懂!!!!我晕。。。
#10
讲的好。
#11
第二题还有谁能讲的再通俗点么??
另外第一题把a赋给b之后,unsigned int型的b的高位不是要用0补齐么?那这样的话b=0x 00 00 00 e0么?怎么会是0xffffffe0呢??
另外第一题把a赋给b之后,unsigned int型的b的高位不是要用0补齐么?那这样的话b=0x 00 00 00 e0么?怎么会是0xffffffe0呢??
#12
还没有面试,只是简单的笔试。其实题目不难,对基础要求比较高,要理解比较深。。
#13
第一题既然unsigned int 型在高位要补齐,不是用0补齐么?难道用1?解释下谢谢哈
#14
LZ笔试的是什么岗位啊?
对C语言要求很高么?
对C语言要求很高么?
#15
半懂半不懂,如果把%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
ls讲的很清楚了,有符号数扩宽填充符号位
#18
嗯,这题我搞懂了。。。自己绕住自己了。。
#19
就这个,我乱的不得了。。简直是不懂。。怪自己理解不到底,学的太差了
#20
貌似技术类都是一套卷子就是c语言还有其它一些操作系统网络等题目。。。
#21
signed char a=0xe0 ;a是signed int 所以在内存中高位用符号位补齐,
#22
看来 我三题全错啊
#23
error C2632: 'long' followed by 'long' is illegal
呃呃呃
VC不支持long long???
呃呃呃
VC不支持long long???
#24
++
#25
请教第一个问题。我印象中是这样的:
第一题: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
汇编代码如下
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不会吧真实招聘的题目随便拿来给实习生做了吧.
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
+1 还是版主猛啊
#35
第二题为什么访问a,b,c的时候是依次4个字节的在栈上读呢?为什么不是取a,b,c各自的地址后在再取4个字节呢?
对a的强制转换难道会影响到b吗?
#36
变参调用只能是__cdecl调用协定. 具体理解就是由format string来决定的, %d的意思就是double word, 4字节.
具体参考
http://blog.csdn.net/jiqiren007/article/details/6151640
#37
第三题是不应该是18吗?
#38
你的系统要是64位的就除了第一个不是乱码,从第二个起(包含)就都是乱码。
原因建议看一下printf函数实现。
#39
哎~~ 基础不牢啊...
#40
。。。第二题在C++中不可能出现的,这让C++程序员好苦逼呀
#41
技术类的都是这一份试卷
#42
基本正确,纠正下a=-32。
#43
版主,我想问下,在实际应用中,这样的代码是在什么领域运用的?是改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%的机率蒙对的.
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
想说的是,面试的题目,实际项目中真的用不到,这种面试无异于现在的高考,体现不出个人的真实能力。
#46
老实说第一题和第三题真的应该做出来!第二题确实对我来说太难了点。。晓得是右向左压栈,可是为什么是取4个bytes呢?这点我也不懂。。。忘老大给更详细通俗的解。这题把我弄懂了,我就100分都给你了
#47
第一和第三应该对,,第二题有点难了
#48
我不是很同意你的说法,基础要牢固,不管有多牛,能力多强,基础不牢固总是不能发展久远的,除非心思不在技术。 个人理解。
#49
变参调用只能是__cdecl调用协定. 具体理解就是由format string来决定的, %d的意思就是double word, 4字节.
具体参考
http://blog.csdn.net/jiqiren007/article/details/6151640
#50
谢谢了哈。。
#1
大端模式:字数据的高字节存储在低地址中,而低字节存储在高地址中。
小端模式:字数据的高字节存储在高地址中,而低字节存储在低地址中。
这样楼主应该好理解了吧
小端模式:字数据的高字节存储在高地址中,而低字节存储在低地址中。
这样楼主应该好理解了吧
#2
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.
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
第二条这个东西太鬼畜!不过我真心怀疑这个是企鹅的面试题。
#8
正解
#9
好厉害呀。。。我真心不懂!!!!我晕。。。
#10
讲的好。
#11
第二题还有谁能讲的再通俗点么??
另外第一题把a赋给b之后,unsigned int型的b的高位不是要用0补齐么?那这样的话b=0x 00 00 00 e0么?怎么会是0xffffffe0呢??
另外第一题把a赋给b之后,unsigned int型的b的高位不是要用0补齐么?那这样的话b=0x 00 00 00 e0么?怎么会是0xffffffe0呢??
#12
还没有面试,只是简单的笔试。其实题目不难,对基础要求比较高,要理解比较深。。
#13
第一题既然unsigned int 型在高位要补齐,不是用0补齐么?难道用1?解释下谢谢哈
#14
LZ笔试的是什么岗位啊?
对C语言要求很高么?
对C语言要求很高么?
#15
半懂半不懂,如果把%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
ls讲的很清楚了,有符号数扩宽填充符号位
#18
嗯,这题我搞懂了。。。自己绕住自己了。。
#19
就这个,我乱的不得了。。简直是不懂。。怪自己理解不到底,学的太差了
#20
貌似技术类都是一套卷子就是c语言还有其它一些操作系统网络等题目。。。
#21
signed char a=0xe0 ;a是signed int 所以在内存中高位用符号位补齐,
#22
看来 我三题全错啊
#23
error C2632: 'long' followed by 'long' is illegal
呃呃呃
VC不支持long long???
呃呃呃
VC不支持long long???
#24
++
#25
请教第一个问题。我印象中是这样的:
第一题: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
汇编代码如下
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不会吧真实招聘的题目随便拿来给实习生做了吧.
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
+1 还是版主猛啊
#35
第二题为什么访问a,b,c的时候是依次4个字节的在栈上读呢?为什么不是取a,b,c各自的地址后在再取4个字节呢?
对a的强制转换难道会影响到b吗?
#36
变参调用只能是__cdecl调用协定. 具体理解就是由format string来决定的, %d的意思就是double word, 4字节.
具体参考
http://blog.csdn.net/jiqiren007/article/details/6151640
#37
第三题是不应该是18吗?
#38
你的系统要是64位的就除了第一个不是乱码,从第二个起(包含)就都是乱码。
原因建议看一下printf函数实现。
#39
哎~~ 基础不牢啊...
#40
。。。第二题在C++中不可能出现的,这让C++程序员好苦逼呀
#41
技术类的都是这一份试卷
#42
基本正确,纠正下a=-32。
#43
版主,我想问下,在实际应用中,这样的代码是在什么领域运用的?是改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%的机率蒙对的.
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
想说的是,面试的题目,实际项目中真的用不到,这种面试无异于现在的高考,体现不出个人的真实能力。
#46
老实说第一题和第三题真的应该做出来!第二题确实对我来说太难了点。。晓得是右向左压栈,可是为什么是取4个bytes呢?这点我也不懂。。。忘老大给更详细通俗的解。这题把我弄懂了,我就100分都给你了
#47
第一和第三应该对,,第二题有点难了
#48
我不是很同意你的说法,基础要牢固,不管有多牛,能力多强,基础不牢固总是不能发展久远的,除非心思不在技术。 个人理解。
#49
变参调用只能是__cdecl调用协定. 具体理解就是由format string来决定的, %d的意思就是double word, 4字节.
具体参考
http://blog.csdn.net/jiqiren007/article/details/6151640
#50
谢谢了哈。。