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

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 循环内判断条件恒成立,代码死循环。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值