数据在内存中的存储相关练习题

本文通过多个实例详细解析了C语言中不同类型的变量如何在内存中存储,并展示了有符号与无符号数在运算过程中的差异及可能引发的死循环等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

数据在内存中是按照补码的形式存储的

在这里容易混淆概念的有以下练习题

1. 程序会输出什么?

int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a = %d, b = %d, c = %d\n", a, b, c);
	system("pause");
	return 0;
}

此时计算机中,-1是这样存储的


在c语言中char默认为有符号类型,那么在打印的时候,a, b的打印结果应该一样,c是无符号类型所有的比特位都表示数据。

可是现在是要按照%d输出,整型需要4字节,这就涉及到了比特位填充的问题

比特位填充的是变量自身的类型。也就是说,有符号数填充的符号位,无符号数填充的是0

那打印出来的结果就是这样的:



2. 程序会输出什么?

int main()
{
	char a = -128;
	printf("%u\n", a);
	system("pause");
	return 0;
}

很明显a是有符号数,当它在进行比特位扩充的时候就应该扩充的是符号位1

那当a按照%u进行无符号打印的时候,那打印出来的结果转成二进制就是这样的:

1111 1111   1111 1111   1111 1111   1000 0000(25个1+7个0)


3. 程序会输出什么?

int main()
{
	char a = 128;
	printf("%u\n", a);
	system("pause");
	return 0;
}

那打印出来的结果转成二进制就是这样的:

1111 1111   1111 1111   1111 1111   1000 0000(25个1+7个0)


4. 程序会输出什么?

int main()
{
	int i = -20;
	unsigned int j = 10;
	printf("%d\n", i + j);
	system("pause");
	return 0;
}

按照补码形式进行运算结束后,无符号和有符号最终统一格式化为有符号整数

那打印出来的结果就是这样的:



5. 程序会输出什么?

int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
	}
	system("pause");
	return 0;
}

答案是:陷入死循环

很明显无符号数是永远>=0的

这个打印结果就是9 -->0,再从很大的数字往下减,减为0之后,再从很大的数字往下减。。。


6. 程序会输出什么?

int main()
{
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d\n", strlen(a));
	system("pause");
	return 0;
}

刚开始肯定是:-1,-2,-3,......,-128

接下来呢?


那就是:127,126,......,1,0,.......

strlen在读的时候遇到0就会停止读取数据

那打印出来的结果就是这样的:



7. 程序会输出什么?

int main()
{
	short int num = 32767;
	short int a = num + 1;
	printf("%d\n", a);
	system("pause");
	return 0;
}

那打印出来的结果就是这样的:



8. 程序会输出什么?

unsigned char i = 0;
int main()
{
	for (i = 0; i <= 255; i++)
	{
		puts("hello world\n");
	}
	system("pause");
	return 0;
}

答案是:陷入死循环

unsigned char类型一个字节,它能表示的最大数是255(1111 1111),循环条件永远成立。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值