携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第20天,点击查看活动详情
:punch: 小试牛刀
到这里我们已经学习了整型在内存中如何存储,我们来写几个练习巩固一下吧!
练习题目
下面一共7道题目
大家可以试着练习一下,我会给大家一一讲解
//练习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);
return 0;
}
//练习2
#include <stdio.h>
int main()
{
char a = -128;
printf("%u\n",a);
return 0;
}
//练习3
#include <stdio.h>
int main()
{
char a = 128;
printf("%u\n",a);
return 0;
}
//练习4
#include <stdio.h>
int main()
{
int i= -20;
unsigned int j = 10;
printf("%d\n", i+j);
//按照补码的形式进行运算,最后格式化成为有符号整数
}
//练习5
#include <stdio.h>
int main()
{
unsigned int i;
for(i = 9; i >= 0; i--)
{
printf("%u\n",i);
}
return 0;
}
//练习6
int main()
{
char a[1000];
int i;
for(i=0; i<1000; i++)
{
a[i] = -1-i;
}
printf("%d",strlen(a));
return 0;
}
//练习7
#include <stdio.h>
unsigned char i = 0;
int main()
{
for(i = 0;i<=255;i++)
{
printf("hello world\n");
}
return 0;
}
:pushpin: 练习讲解
//练习1
//输出什么?
#include <stdio.h>
int main()
{
char a = -1;
//-1 : 补码 11111111 11111111 11111111 11111111
//截断放入 a: 11111111
signed char b = -1;
//-1截断放入b中 b: 11111111
unsigned char c = -1;
// 同理 c: 11111111
printf("a=%d,b=%d,c=%d", a, b, c);
//a和b是有符号字符型,%d打印整型提升补充符号位后
//补码 11111111 11111111 11111111 11111111
//得到原码:10000000 00000000 00000000 00000001
//所以a和b打印结果是-1
//而c是无符号字符型,所以整型提升,补充0
//00000000 00000000 00000000 11111111
//转换原码 00000000 00000000 00000000 11111111
//所以c的打印结果是 225
return 0;
}
运行结果
//练习2
#include <stdio.h>
int main()
{
char a = -128;
//-128 原码:00000000 00000000 00000000 10000000
//补码: 11111111 11111111 11111111 10000000
//截断存入char a 中 10000000
printf("%u\n", a);
//%u无符号的形式打印
//a是有符号char 整型提升补充符号位
// 11111111 11111111 11111111 10000000
//而%u默认该数据为无符号数据,所以认为a的原码补码相同
//打印结果 4294967168
return 0;
}
运行结果
//练习3
#include <stdio.h>
int main()
{
char a = 128;
//128 00000000 00000000 00000000 10000000
//截断存入char a :10000000
printf("%u\n", a);
//整型提升char a有符号,补符号位
//11111111 11111111 11111111 10000000
//%u无符号的形式打印,认为该数据原码补码相同
//打印 4294967168
return 0;
}
看到
练习3的结果和练习2的结果一样,一个是-128,一个是128
但以%u打印了一样的结果!
因为无论是
128还是-128截断后存储到a都是相同的二进制位!
//练习4
#include <stdio.h>
int main()
{
int i = -20;
//-20 原码:10000000 00000000 00000000 00010100
//补码 : 11111111 11111111 11111111 11101100
unsigned int j = 10;
//10 : 00000000 00000000 00000000 00001010
printf("%d\n", i + j);
//i+j补码:11111111 11111111 11111111 11110110
//原码: 10000000 00000000 00000000 00001010
// 打印 -10
//按照补码的形式进行运算,最后格式化成为有符号整数
}
运行结果
//练习5
#include <stdio.h>
int main()
{
unsigned int i;
//无符号int i 所以始终大于等于0
for (i = 9; i >= 0; i--)
{
printf("%u\n", i);
//无法退出循环
}
return 0;
}
unsigned int 范围:0~2^32
代码会发生死循环!
运行结果
//练习6
#include<stdio.h>
int main()
{
char a[1000];
int i;
for (i = 0; i < 1000; i++)
{
a[i] = -1 - i;
//a[i]是字符型,范围为-128~127
//超过会进行截断存入a[i]中
//当-129存入a[128]中截断
//-129 :原 10000000 00000000 00000000 10000001
// 补码 11111111 11111111 11111111 01111111
//截断 后存入a[128]中 01111111
//此时a[128]符号位为0 故存入的为 127
//后面数据同理
//当a[255]=-256
// -256 原 10000000 00000000 00000001 00000000
//补码 : 11111111 11111111 11111111 00000000
// 故此时a[255]存入的是 0
}
printf("%d", strlen(a));
//strlen 遇到'\0'停止计数,也就arr[255],所以返回长度为255
return 0;
}
char中的范围就是这样的,所以但一个数据小于-128时下一个数据就是127 大于127下一个数据就是-128
运行结果
//练习7
#include <stdio.h>
unsigned char i = 0;
//unsigned char 范围为0~255
int main()
{
for (i = 0; i <= 255; i++)
{
printf("hello world\n");
//当i=255时,i++后,i循环回到i=0
//所以该代码会发生死循环
}
return 0;
}
运行结果
这就是所以练习的答案了,是不是还有点意犹未尽!如果还没学会可以多看几遍!