C语言中整型/实型/字符型数据在内存中的存储方式、易错点以及进制转换1

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

一、整形数据在内存中的存放和进制转换?

  • 存放形式

  • 存放方式

  • 字节

  • 进制转换

  • 整型数据的溢出

  • 二、浮点型数据在内存中的存放方式?

  • 按指数形式存储(有图示)

    浮点型数据的舍入误差

  • 字符常量与字符串常量(易错)

  • 四、字符数据在内存中的存储方式及使用用法?

  • 五、混合运算


前言

在学习常量和变量时遇到的一些 延伸问题,如整型数据(存放方式和形式、进制转换、字节、以及不同类型的范围等)、浮点型数据的存放、字符数据的存放形式、字符串常量和字符常量在赋值是的易错点 以及各类数值型数据间的混合运算(数据类型转换)

一、整形数据在内存中的存放和进制转换?

 1、数据存放形式:二进制         ;        数据存放方式:补码

正数存原码(三码统一),负数存补码(补码是由原码取反再加1 得到的)

最左边的为符号位(0正1负),是当存储的数据为无符号型(unsinged),则最左边的最高位不作符号位,而用来存储数据。

2、字节

(1)即计算机中的单位(硬件/通电/正电用1,负电用0),而二进制只能由0和1组成,数据就是以二进制的形式存放在计算机中的。

(2)bit 比特位  ,byte 字节(有8个bit)

      byte  /  kb / mb / gb / tb / pb (间隔1024)

 3、进制转换【如下】

3.1   

十进制:用十个可用符号(0、1、2、3、4、5、6、7、8、9)来表示一个数字,如

235------    2*10^2+ 3*10^1+ 5*10^0

二进制:用两个可用符号(0和1)来表示一个数字,如

1011------  1*2^0+1*2^1+0*2^2+1*2^3

八进制:用八个可用符号(0、1、2、3、4、5、6、7)来表示一个数字,如

277------  7*8^0+7*8^1+2*8^2

十六进制:用十六个可用符号(0、1、2、3、4、5、6、7、8、9、A、B、C、D、E、F)来表示一个数字,如2AE------  14*16^0+10*16^1+2*16^2

3.2 十进制转二进制(或八进制或十六进制)------连除法(除到商为0 位置,从下往上写)

3.3 二/八/十六进制间的相互转换:

每三位二进制可以转换成一位八进制, 如    1011 1001   ---  271 (8)

每四位二进制可以转换成一位十六进制,如1011 1001   ---   B9 (16)

4、整型数据的溢出:由于范围不同,若是范围过小则为“溢出”,此现象并不报错,而是重新从最小值计数。

二、浮点型数据在内存中的存放方式?

1、一个浮点型数据一般在内存中占四个字节。与整型数据的存储方式不同,浮点型数据是按照指数形式存储的。  系统把一个浮点型数据分成 小数部分指数部分,分别存放。指数部分采用规范化的指数形式。实数3.14159在内存中存放的形式如下:

2.浮点型数据的舍入误差

float前六位有效数字,6位小数4字节
double前15位,6位小数8
long double前15位,6位小数8

代码如下(示例):a和b 输出的值一样,float 型的数据只有前六位有效数字,可以保证正确,其余的是随机的。

#include<stdio.h>
int main()
{
    float a,b;
a=123456.789e5;
b=a+20;
printf("%f\n",b);
}

三、为什么不能 把一个字符串常量赋值给一个字符变量?

1、合法字符串    '' How do you do.''   ,''CHINA''  ,  ''$123.45" ,  "你好"   等等。

printf("How do you do?");  //输出一个字符串

2、'a'是字符常量  ,''a''是字符串常量,二者不同。

char c;   //假设c被指定为字符变量
c='a';   //是正确的

c=''a'';  //error
c=''CHINA'';   //error

3、[易错]不能把字符串常量赋给一个字符型变量。

.

四、字符数据在内存中的存储形式及其使用方法

将一个字符常量放到一个字符变量中,实际上并不是把该字符本身放到内存单元中去,而是将该字符的相应的ASCII 码放到存储单元中。

既然在内存中,字符数据以ASCII码存储,它的存储形式就与整数的存储形式类似。这样使字符型数据和整型数据间可以通用。一个字符数据既可以以字符形式输出,也可以以整数形式输出。

【运行】结果:a  b 

                       97  98

#include<stdio.h>
int main()
{
    char c1,c2;
    c1=97;
    c2=98;
    printf("%c,%c\n",c1,c1);
    printf("%d,%d\n",c1,c1);
   return 0;

}

五、各类数值型数据间的混合运算

在这里插入图片描述

1、图中横向向左的箭头表示一定要转换。

例如,float型数据在运算时一律转换成双精度,以提高运算精度(即使是两个float型数据相加,也先都化成double类型,然后再相加)。
字符型数据必定转换成整数,short型转换成int型。

2、纵向的箭头表示当运算对象为不同类型时转换的方向。

例如,int型与double型数据进行运算,先将int型的数据转换成double型,然后在两个同类型(double型)数据间进行运算,结果为double型。

说明:
(1)当单、双精度浮点型数据赋给整型变量时,浮点数的小数部分将被舍弃。

(2)当整型数据赋给浮点数变量时,数值上不发生任何变化,但有效位增加。

(3)如果算术运算符两个运算对象都为整数,那么,运算将按照整型数据的运算规则,这就意味着对于除法运算来讲,其结果的小数部分将被舍弃。在这种情况下,即使运算结果赋给浮点型变量也是一样的,结果的小数部分也将被舍弃。

例如:
float b;
int a=8;

b= 20/a;
b的结果是2.0,而不是2.5。

(4)只要某个算术运算对象中有一个是浮点型数据,其运算将按照浮点型规则来进行,即运算结果的小数部分被保留下来。


总结

整型数据分为short \int\long,为了充分利用变量的值的范围,引出unsigned,所以实际上是6种整型变量。在C语言程序中所有用到的变量都必须在程序中定义,即“强制类型定义”。而在将一个整型常量复制给变量时要根据不同整型变量的范围,若范围太大会造成空间浪费,太小则会有数据的“溢出”。整型数据的存储是以二进制的补码形式存储的。

浮点型变量是由有限的存储单元组成的,因此提供的有效数字总是有限的。在有效位以外的数字将被舍去。浮点型数据在内存中是按照指数形式存储的。

字符数据在内存中存储的形式是:将一个字符常量放到字符变量里,并不是存字符本身而是字符对应的ASCII码。它们存储的形式类似,因此整型数据与字符型数据之间可以互用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值