bilibiliclass28_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",a,b,c);//-1 -1 255
   return 0;
}

解析版:
#include <stdio.h>
int main()
{
   char a= -1;
//11111111111111111111111111111111
//11111111
//整形提升:按符号位提升,由于char是有符号数,所以符号位是1,所以在前面补1
//11111111111111111111111111111111

   signed char b=-1;
//11111111
//整形提升:按符号位提升,由于char是有符号数,所以符号位是1,所以在前面补1
//11111111111111111111111111111111

   unsigned char c=-1;
//11111111
//整形提升:按符号位提升,由于unsigned char是无符号数,所以没有符号位,所以在前面补0
//00000000000000000000000011111111
//正数:255

   printf("a=%d,b=%d,c=%d",a,b,c);//-1 -1 255
   return 0;
}


例题2:

输出什么?
 

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

解析版:
#include <stdio.h>
int main()
{
   char a = -128;
//10000000000000000000000010000000
//01111111111111111111111101111111
//01111111111111111111111110000000-补码
//10000000
//11111111111111111111111110000000整形提升

   printf("%u\n",a);
//打印的是无符号数,直接看其为原码
//4294967168
//%d 有符号10进制整数
//%u 无符号10进制整数
   return 0;
}

 

例题3:

解析版:
 

#include <stdio.h>
int main()
{
char a = 128;//127+1相当于-128,和例题2一样
printf("%u\n",a);
return 0;
}

例题4:

输出什么?

int i= -20;
unsigned int j = 10;
printf("%d\n", i+j);

解析版:
int i= -20;
unsigned int j = 10;
printf("%d\n", i+j);//-10
//按照补码的形式进行运算,最后格式化成为有符号整数
11111111 11111111 11111111 11101100//-20的补码
00000000 00000000 00000000 00001010//10的补码
11111111 11111111 11111111 11110110//结果的补码
10000000 00000000 000000000 00001010//原码-10

例题5:

输出什么?

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

解析版:
9876543210然后死循环-1对应的超大的数

例题6:

输出什么?
 

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

解析版:

int main()
{
char a[1000];//0-999,但char只能放-128到127
int i;
for(i=0; i<1000; i++)
{
   a[i] = -1-i;
}//-1 -2 …… -127 -128 127 126 125……3 2 1 0(strlen读到这停止) -1 -2……
printf("%d",strlen(a));//strlen读到'\0'停止:255
return 0;
}

 

例题7:

输出什么?

#include <stdio.h>

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

解析版:
结果:死循环
原因:无符号数255+1=0

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值