【零天赋C语言】——数据存储习题讲解

这篇博客探讨了C语言中不同数据类型如char、signed char和unsigned char在存储和运算过程中的行为。详细解释了负数在截断和整型提升时的补码、反码和原码转换,并通过实例展示了溢出和无符号整数的打印结果。还分析了涉及负数和无符号数的加法运算以及字符串长度计算中可能出现的特殊情况。
摘要由CSDN通过智能技术生成

1、

#include <stdio.h>
int main()
{
	char a = -1;
	signed char b = -1;
	unsigned char c = -1;
	printf("a=%d,b=%d,c=%d\n", a, b, c);
	return 0;
}

运行结果:

解析:

char a :

char 类型一个比特位——8个字节,-1 是一个整数,有四个比特位——32个字节,char 类型的 a 要存储一个整数-1,必须要发生截断:

-1的原码:10000000000000000000000000000001

-1的反码:111111111111111111111111111111111110

-1的补码:111111111111111111111111111111111111

截断后:11111111           

存入char a 中,最后将 a 以整数(%d)的形式打印出来,就必须要进行整型提升(补一个数的符号位),因为这是一个有符号的整数,所以补符号位:11111111111111111111111111111111111

(存在计算机中的是补码,即这是补码),显而易见这时-1的补码,即打印的结果为-1.

signed  char  a :

有符号的char  a 于上种情况相同,即为 -1.

unsigned  char  a:

因为这是一个无符号的char  类型,只能是正数,其运算的过程与有符号类型基本相同,唯一与有符号类型的区别在于整型提升时,只能补0,所以其整形提升后为:

00000000000000000011111111

​​​由于正数的原码、反码、补码相同,所以打印结果为:255.

2、

#include <stdio.h>
int main()
{
	char a = -128;
	printf("%u\n", a);
	return 0;
}

运行结果: 

解析: 

-128的原码:1000000000000000000000001000000

           反码:1111111111111111111111111110111111

           补码:1111111111111111111111111111000000

存在char  a 中要发生截断:10000000

%u 打印的是无符号整数,先要整型提升补符号位 1 :111111111111111111111111100000000 

将其视为正数进行打印,结果为就是上面那个很大的数。

 3、

#include <stdio.h>
int main()
{
	int i = -20;

	unsigned int j = 10;

	printf("%d\n", i + j);
}

运行结果 :

解析:整型的  i  = -20

原码:10000000000000000000000000010100

反码:11111111111111111111111111111101011

补码:11111111111111111111111111111101100

无符号整型的  j  = 10

原码 / 反码 / 补码:00000000000000000000000000001010

两个数的补码相加:11111111111111111111111111111110110

转换成反码:           11111111111111111111111111111101101

转换成原码:           10000000000000000000000000001010

计算得出值为:-10,将其打印出来。

4、

#include<stdio.h>
int main()
{
	unsigned int i;
	for (i = 9; i >= 0; i--)
	{
		printf("%u\n", i);
	}
	return 0;
}

运行结果:

 

 解析:答案为无限循环

因为 i 是一个无符号整数,其最小值为零,所以循环不会终止,但是当 i 的值变成负数时,打印 %u  无符号整数,负数的补码就视为整数的原码、反码、补码。再将其打印出来,其值在4294967295~0之间循环。

5、

#include<stdio.h>
int main()
{
	char a[1000];
	int i;
	for (i = 0; i < 1000; i++)
	{
		a[i] = -1 - i;
	}
	printf("%d", strlen(a));
	return 0;
}
	

运行结果:

解析:char  类型的取值范围为 127 ~  -128,本题的关键是  strlen  是求字符串长度的,我们要找到 '  \0 '  的位置,而  ' \0 '的ASIIC码值是0.

  

 当负数赋值给了 a[ ]时,a[ ]中只能存下 -1 ~ -128,当值小于 -128 时会发生截断,其值就会增加,到 0, -1 ~ -128 ~0,就找到了0, 128+127 = 255,字符数组的长度就是255.

6、 

#include <stdio.h>
unsigned char i = 0;
int main()
{
	for (i = 0; i <= 255; i++)
	{
		printf("hello world\n");
	}
	return 0;
}

运行结果:

解析:因为 i 是一个无符号char类型,其取值范围为 0~ 255,for 循环内判断条件恒成立,代码死循环。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值