VC6.0环境下,缺省为4字节对齐,cpu(32位小端字节序)
1.以下叙述中不正确的是(D)
A)在不同的函数中可以使用相同变量的名字
B)函数中的形式参数是在栈中保存
C)在一个函数内定义的变量只在本函数范围内有效
D)在一个函数内复合语句中定义的变量在本函数范围内有效(复合语句是指函数中的成对括号构成的代码)
分析:
A:在不同函数中创建的相同变量都是局部变量,局部变量的生存周期是在一个花括号 { }内。出了这个括号就被销毁了
B:函数的形式参数是在栈中保存的
C:在函数内定义的变量也就是局部变量,只有在本函数范围内有效。
D:局部变量的生命周期只有在最近的一个花括号 { } 内
2.在X86下,有下列程序、
#include<stdio.h>
int main()
{
union
{
short k;
char i[2];
}*s,a;
s = &a;
s->i[0] = 0x39;
s->i[1] = 0x38;
printf("%x\n", a.k);
system("pause");
return 0;
}
输出结果是(A)
A)3839 B)3938 B)380039 D)不确定
分析:
大小端的问题,char i[0]存在高地址,低字节处,char i[1]存在低地址,高字节处。但是在short中要满足小端存储,所以shorty用16进制打印就是3839。低地址数据存低字节处,高地址数据存在高字节处。
3.在x86,VC++6.0环境下
#include<stdio.h>
int main()
{
char c;
unsigned char uc;
unsigned short us;
c = 128;
uc = 128;
us = c + uc;
printf("0x%x\n", us);
us = (unsigned char)c + uc;
printf("0x%x\n", us);
us = c + (char)uc;
printf("0x%x\n", us);
system("pause");
return 0;
}
输出结果为(A)
A)0x0 0x100 0xff00
B)0x100 0x100 0xff00
C) 0x100 0x100 0x0
D)0x0 0x100 0x0
分析:
char c; char一个字节能存储的值的范围是 -127~128
unsigned char us ;能存储值的范围是0~255
unsigned short us; short 二个字节能存储的值范围是 -2^15 ~ 2^16-1
c=128; 用char 类型c存储128 存不下,存储的是-128
uc=128; 能存下
us=c+uc; us=-128+128=0 0x0
us=(unsigned char)c+uc ;= 128+128=256 0x100
us=c+(char)uc; =-128+-128=-256 0xff00 无符号uc变为c强制转换为char us 整型提升在前面补1。
所以正确答案就是 A:0x0 0x100 0xff00