C语言得问题

1 问题描述:

1
float a = 2.9;//为什么是一个很大的正数?
float b = 2.5;//为什么是0?
//不同的小数是如何存在内存中的?
printf("%d\n",a); //%d打印float 出现数据丢失的过程是什么样的?

原因分析:

1 不明白实型是怎么存在内存中得
2 实型用整型打印出现得数据丢失得过程不清楚

解决方案:

1 实型 在内存中存得形式:float 符号位(1)指数位(8)尾数位(23) double 符号位(1)指数位(11)尾数位(52)
实型:转化成二进制
指数:小数点移动得位数+127
尾数位:小数点后面得二进制
2

2 问题描述:

同类型有无符号得相互转换例如:
unsigned char = -2 322 0 255 -128 printf(%d)以无符号形式打印和有符号形式打印得区别,以及转换得过程

原因分析:

1没搞懂类型得取值范围如何计算, 没搞懂二进制得补码如何转化成真值
2 赋值如果数据溢出没分清内存如何处理
3 忘记了 如果常量与定义类型不匹配会如何
4 计算机如何存储负数二进制得 以及转成正数得计算过程

解决方案:

C语言得问题

1 例如char 类型得有符号取值为什么回事-128----127
-128是怎么来的:-128没有原码和反码(只有补码)。原因如下
-128的反码和-0的反码相同,所以为了避免面混淆,有了-0的原码,便不能有-128的原码补码,这是8位比特位位数限制决定的。
符号位上的进位舍弃。(所以,舍弃了符号位的补码的第一位是数值位,不是符号位,符号位舍弃了)

这里还涉及二进制得补码如何得到真值:根据补码得得正负选择得到真值,如果二进制补码代表负数,那符号位不变其余取反加一得到二进制再除去符号位剩下得相加就是真值(也就是负数补码得补码除去符号位就是真值)。。如果二进制补码代表得是正数,那本身就是真值不存在符号位。

2 例如定义unsigned char a = 322 因为unsigned 最大数值是255 所以超出 ,那

4 原来内存中都是以二进制得补码形式存放数据得 只不过正数得补码就是本身原码,负数得补码就是原码取反加一
反码表示法规定:正数的反码与其原码相同。负数的反码是对其原码逐位取反,但符号位除外。
比如 定义无符号char = -2 首先知道无符号是每位有效,其次将-2得补码得到 因为是无符号最后运算每位有效数值之和,即可得到一个负数得无符号正数,而有符号数值就是它本身。

3 问题描述:

原因分析:

解决方案:

4 问题描述:

原因分析:

解决方案:

5 问题描述:

原因分析:

解决方案:

6 问题描述:

原因分析:

解决方案:

问题描述:

原因分析:

解决方案:

问题描述:

原因分析:

解决方案:

问题描述:

原因分析:

解决方案: