一. 练习题目
我们先从几道题目开始 复习下上一篇博客的内容
练习1
下面这段代码的输出结果是什么?
#define _CRT_SECURE_NO_WARNINGS 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; }
首先来分析下题目 根据我们在前面学到的知识 signed char 和 char其实是同一种类型
所以说 a 和 b的输出结果都是一样的 都是-1
我们都知道 在计算机中存储一个数字的补码
我们画图来表示下c的存储过程
关于整型提升的相关知识大家可以参考我的这篇博客
所以说 输出的三个数字分别是 -1 -1 255
练习2
代码如下
int main() { char a = -128; printf("%u\n", a); return 0; }
题目分析如下
我们得到的最终结果是
扩展题
如果我们打印char a 是 128呢?
它的结果会是什么?
大家可以自己思考一下
(注意char类型的取值范围)
练习3
以下代码的输出结果是?
int main() { int i = -20; unsigned int j = 10; printf("%d\n", i + j); return 0; }
还是一样 我用画图的方式来给大家解决这个问题
所以说 它打印出来的十进制数字是- 10
通过上面几道题目的计算 相信大家对于有符号数 无符号数的理解应该会加深一层
练习4
代码表示如下
int main() { char a[1000]; int i; for ( i = 0; i < 1000; i++) { a[i] = -1 - i; } printf("%d", strlen(a)); return 0; }
要想知道这个题目的答案我们首先要知道两个知识点
1 字符串结束的表示是‘\0’,它的ascll码值就是0
2 char类型作为一个无符号数的时候有范围 它的范围是-128~127
如下图
由上面这些知识我们可以知道
数组i里面存储的值会是这样子的规律
-1 - 2 … …-128 127 126 … 3 2 1 0
其中-1到0一共经历了 127 +128 一共255个字符
所以说字符串长度为255
练习5
请问下面代码运行的结果是?
int main() { unsigned int i; for ( i = 9; i >= 0; i++) { printf("%u\n", i); } return 0; }
这里我们要注意的是
unsigned int i 是一个无符号数
所以说它的值恒大于等于0
因此 我们可以说这个代码一定会进入死循环
练习6
unsigned char i = 0; int main() { for ( i = 0; i <= 255; i++) { printf("hello world\n"); } return 0; }
上面代码的运行结果是?
我们说
unsigned char i 是一个无符号数 占用一个字节的大小
所以说它的表示范围是 0000 0000(0) 到 1111 1111 (255)
因此 它小于等于255恒成立
所以说 代码会进入死循环
二. 浮点数在内存中的存储
老规矩 我们先来看一段代码
int main() { int n = 9; float* p = &n; printf("%d\n", n); printf("%f\n", *p); *p = 9.0; printf("%d\n", n); printf("%f\n", *p); return 0; }
请问上面四个printf程序从上到下依次输入的值是?
让我们带着这个问题 来进入下面的浮点数规则学习
浮点数的储存规则
根据国际标准IEEE 任意一个二进制浮点数V可以表示成下面的形式
- 1(-1)^ S * M * 2^E
- 2其中(-1)^ S表示符号位 当s=0时 表示为一个正数 当s=1时表示为一个负数
- 3M表示有效位数字 大于等于1 小于2
- 42^E表示指数位
我们举例来说
十进制的5.5 写成二进制就是101.1 相当于1.011x2^2
那么 按照相面形式 我们可以得到
S = 0
M = 1.011
E = 2
我们规定
在32位的系统中
最高位1位是符号位S
接着8位是指数E
剩下23位是有效数字M
在64位的系统中
最高位1位是符号位S
接下来11位是指数E
剩下23位是有效位数字M
我们规定 在存浮点数的时候省略M最前面的数字1
对于8位数的E 我们在储存中加上一个127
对于11位数的E 我们在储存中加上一个1023
还是以5.5为例 它的浮点数存储形式为
0 (S) 1000 0001(E) 01110 00000 00000 00000 000 (M)
补充
当指数E从内存中取出的时候
E不全为0或者不全为1
这时候指数E的计算值减去127(或1023)得到真实值
E全为0时
我们可以将它看作为0
E全为1时
我们将它看作无限
好了 这时候我们运用我们目前所学到的知识来解决上面的题目
9的整数储存应该是
0000 0000 0000 0000 0000 0000 0000 1001
9的浮点数储存应该是
0 1000 0010 001 0000 0000 0000 0000 0000
所以说上面两个输出的值应该为 9 和0.000000
下面两个输出的值应该为 一个很大的正数 和9.000000
以上就是本篇博客的全部内容啦 由于博主才疏学浅 所以难免会出现纰漏 希望大佬们看到错误之后能够
不吝赐教 在评论区或者私信指正 博主一定及时修正
那么大家下期再见咯