遇到的题目总结

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


猜你喜欢

转载自blog.csdn.net/SoYangA/article/details/80654178