2021-08-16 C语言实验一

一、类型转换实验----题目出处:《程序员面试宝典》

1、代码如下,问输出分别是什么?

#include 
int main()
{
	unsigned int a=0xfffffff7;
	unsigned char i=(unsigned char)a;
	char *b=(char*)&a;
	printf("%08x,%d,%08x,%d",i,i,*b,*b);
	return 0;
 } 

第一段,int型的a转换为无符号型的char,则i的值取低位一个字节f7,注意,x86系列的机器中,数据是小端存储,即低地址字节存放低位数据,高地址字节存放高位数据。第二段,(char*)&a是取a的地址,然后截断取一个字节数f7赋值给一个有符号数char b,但是,有符号数b的数值表示范围如下:

2021-08-16 C语言实验一_第1张图片

 f7的十进制数是247>127,所以该数若存储在计算机中是以补码形式存储的,1111 0111的原码是减去1后取反,即为0000 1001即9,所以247表示的应是-9,而-9的32位输出应是9取反后加1即fffffff7。

运行程序,输出结果为:

000000f7,247,fffffff7,-9
--------------------------------
Process exited after 0.2883 seconds with return value 0
请按任意键继续. . .

2、修改代码如下:

#include 
int main()
{
	unsigned int a=0xfffffff7;
	unsigned char i=(unsigned char)a;
//	char *b=(char*)&a;
//	printf("%08x,%d,%08x,%d",i,i,*b,*b);
	unsigned char *b=(unsigned char*)&a;
	printf("%08x,%08x",i,*b);
	return 0;
 } 

输出结果都为:

000000f7,000000f7
--------------------------------
Process exited after 0.2965 seconds with return value 0
请按任意键继续. . .

二、赋值----题目出处:《程序员面试宝典》

1、以下代码输出什么?

#include 
#include 
int i=2;
int main()
{
	int i=i;
	int j;
	int p[100];
	printf("%d\n",i);
	for(j=0;j<100;j++)
		printf("%d ",p[j]);
	return 0;
}

i值一开始定义为了全局变量,进入main函数后又定义为了局部变量,并且把i赋值给i,由于在main函数中只有局部变量i有效,所以i的值不是全局变量值1而是一个未定义的值,打印输出的i为一个随机值。同样,数组p[100]中的值也未定义,所以输出结果也是随机值。程序输出如下:

1
-2030043001 0 0 0 0 0 652677420 32762 8082928 0 672267281 32762 0 0 44 0 0 0 0 0 4 0 64 0 7340032 0 672250555 32762 7340032 0 2 0 44 0 64 0 7340880 0 6487552 0 7345088 0 658874576 32762 7344976 0 4223016 0 0 0 652784712 32762 7344992 0 4204120 0 4223016 0 268501009 0 7341912 0 652716790 32762 4202624 0 0 0 4202624 0 8 0 0 0 0 0 8 0 4203633 0 4202624 0 44 0 7344976 0 1 0 -1 -1 1 0 1 0 4203657 0 3 0 44 0
--------------------------------
Process exited after 0.4826 seconds with return value 0
请按任意键继续. . .

你可能感兴趣的:(c语言)