嵌入式学习Day2 C语言 --- 进制,基本数据类型

进制与进制转换

----------------------进制---------------------------

进制:进位的制度 

十进制:  逢十进一(出现十个数字后进一) 
十六进制:逢十六进一(出现十六个数字后进一)
八进制:  逢八进一(出现八个数字后进一) 

eg:
十进制:
  0   1   2   3   4   5   6   7   8   9
 10  11  12  13   ....               19
 20  21  ...                         29 
 ...
 
十六进制:                             // 10  11  12  13  14  15
 0   1   2   3   4   5   6   7   8   9   a   b   c   d   e   f
10  11  12 ...                          1a  1b    ...        1f
20 ...
...

八进制:
 0   1   2   3   4   5   6   7 
10  11  12  13  ...         17
20  21  ...
...

二进制:
            0 1
          10 11
100 101 110 111
1000 ...
...

------------------------进制转换------------------------

十进制 转 二进制 

除2取余法

     2|123
      ----
      2|61 ... 1                  ----低位
       --
       2|30 ... 1 
        ---
         2|15  ... 0
          ---
           2|7   ... 1
            --
            2|3   ... 1
              --
              2|1    ... 1
               --
                0     ...  1        ---高位 
            
            
        0111 1011 

        
二进制转十进制: 

法一:加权求和(对应数字的大小乘以权重后相加)
法二:8421BCD码(只是适应于位数小于等于四位的二进制转换为十进制)

法一eg:

1 0 1 1   -->  1*2^3+0*2^2+1*2^1+1*2^0 = 11

法二eg:

1 0 1 1   -->  1*8+0*4+1*2+1*1 = 11


二进制转十六进制:

原理:1位十六进制数 对应4位二进制数  

eg:0111 1011 
     7    b
            

二进制转八进制:

原理:1位八进制数 对应3位二进制数

eg:001 111 011 
     1   7   3 

常量与变量 

常量 :在程序运行过程中,值不能被改变的量

变量:在程序运行过程中,值能被改变的量

基本数据类型(整型、浮点型、字符型)

整形的相关知识 

-----------------------整型--------------------------

1、整形的三种常量形式:

123     //十进制 
0x123   //十六进制 
0123    //八进制 


2、变量形式:数据类型 + 变量名

变量名起名: 
1.数字,字母,下划线 
2.数字不是开头 
3.区分大小写 
4.不能与关键字重名 
5.不要和系统二级关键词重名  (include 预处理的命令)
6.不能与库函数重名

数据类型:
  short      // 在内存中占2个字节空间
  int        // 在内存中占4个字节空间
  long       // 在内存中占4个字节空间
  long long  // 在内存中占8个字节空间

  signed / unsigned   //(有符号 / 无符号)以上几种类型都可加这两这之一做前缀,不写默认是有符号

有符号数:
        二进制位中最高位为符号位
        包含了 正数 负数 
无符号数:
        二进制位种不包含符号位 
        包含非负数 
 

eg:

int a;    // 先开空间 后给值 
a = 10;   // 赋值 

int a = 10; //初始化   开空间的同时给了值

3、 整形数据存储
 
a.字节序 (大端、小端)

大端存储:

   高位数据 存储在 低地址处 
   低位数据 存储在 高地址处

小端存储:
   
   高位数据 存储在 高地址处 
   低位数据 存储在 低地址处
   口诀(高高低低)
eg:
int a = 0x12345678;  //从左到右数据位由高到低

b.数值的存储(不论正数还是负数在计算机里边都存储的是二进制补码的形式)

正数:原码,反码,补码相同
负数:原码除符号位外按位取反为反码,反码加1为补码

eg:

0000 0000 0000  0000 0001 0110 0010 1110 //5678(原码反码补码三码相同)
 0    0    0     0     1   6     2   e   //十六进制
 
1000 0000 0000 0000 0001 0110 0010 1110  //-5678 (原码)
1111 1111 1111 1111 1110 1001 1101 0001  //-5678 (反码)
1111 1111 1111 1111 1110 1001 1101 0010  //-5678 (补码)
   f   f    f     f   e    9    d     2  //十六进制


负数知道补码求原码的两种方法:

法一:补码减一为反码,反码除符号位外按位取反即为原码
法二:补码除符号位外按位取反的到反码,反码加1即为原码

eg:

法一:
1111 1111 1111 1111 1110 1001 1101 0010  //-5678 (补码)
1111 1111 1111 1111 1110 1001 1101 0001  //-5678 (反码)
1000 0000 0000 0000 0001 0110 0010 1110  //-5678 (原码)

法二:
1111 1111 1111 1111 1110 1001 1101 0010  //-5678 (补码)
1000 0000 0000 0000 0001 0110 0010 1101  //-5678 (反码)
1000 0000 0000 0000 0001 0110 0010 1110  //-5678 (原码)


c.数据类型大小(能表示的十进制的最大最小值)

unsigned int (无符号整形)  --> [0 ~ 2^32 -1]

0000 0000 0000 0000 0000 0000 0000 0000   //最小值 --> 0
1111 1111 1111 1111 1111 1111 1111 1111   //最大值 --> 2^32 - 1 //42亿多 

最大值的计算过程:
1111 1111 1111 1111 1111 1111 1111 1111
+                                     1
---------------------------------------
1 0000 0000 0000 0000 0000 0000 0000 0000 //2^32 - 1 //42亿多 

  

signed int (有符号整形) -->  [-2^31 ~ +2^31-1]

正数:
0|000 0000 0000 0000 0000 0000 0000 0000  //正数的最小值 0
0|111 1111 1111 1111 1111 1111 1111 1111  //正数的最大值 2 ^ 31 - 1 //21亿多 

负数:
1|000 0000 0000 0000 0000 0000 0000 0000  //负数的最小值 -2,147,483,648
1|111 1111 1111 1111 1111 1111 1111 1111  //负数的最大值 -1 

推到过程:
1|000 0000 0000 0000 0000 0000 0000 0000  //某个负数的补码
1|000 0000 0000 0000 0000 0000 0000 0000  //负数  
                                          //负的0,不能这样写,C语言做了以下规定
                                          //规定 符号位 既充当符号位又当数值位,short  long  long long,在这块的算法一样
                                          //所以这块的十进制的值为 -2,147,483,648
                                         
1|111 1111 1111 1111 1111 1111 1111 1111  //某个负数的补码
1|000 0000 0000 0000 0000 0000 0000 0001  //-1                                                                                  
同理有一下结论:

unsigned short(无符号短整型) -->  [0~2^16-1] //65536-1 
signed short  (有符号短整型) -->  [-2^15 ~ +2^15-1] //-32768 ~ 32767 

整型的溢出(以unsigned short类型为例 )

上溢出:一个unsigned short类型,最大存储 1111 1111 1111 1111 ,此时在加1,会将多余的高位溢出

整型的溢出:(上溢出)
   1111 1111 1111 1111 
 +                              1
------------------------------
1 0000 0000 0000 0000 

溢出1,剩余 0000 0000 0000 0000   --->  0

unsigned short i = 0;

for (i = 0;  i <= 65536; ++i)
{
    printf("i = %d\n",i);    //重复打印0 ~ 65535
}

下溢出:一个short类型,最小存储  0000 0000 0000 0000,此时在减1,将会有以下结果

整型的溢出:(下溢出)

  0000 0000 0000 0000
-                                  1
--------------------------------
1 1111 1111 1111 1111 

  unsigned short i = 0;
  i = i - 1;
  printf("i = %d\n",i);  //打印结果 65535

可用下图来形象类比:上溢出逆时针走到下个数字,下溢出顺时针走到下个数字

浮点型的相关知识

----------------------------浮点型---------------------------------

1.常量形式 

 1.234 
 1.2e3 //科学计数法形式  //1.2*10^3 
 1.2E3 //e后面 可以是正数 或 负数 不能是小数,e用大小写都行

2.变量形式:数据类型 + 变量名

变量名起名: 
1.数字,字母,下划线 
2.数字不是开头 
3.区分大小写 
4.不能与关键字重名 
5.不要和系统二级关键词重名  (include 预处理的命令)
6.不能与库函数重名

数据类型:
float   //单精度 4个字节
double  //双精度 8个字节

3.数据存储 

单精度存储:

  符号位|指数位|尾数位
    1位 | 8 位|23位  
         +127

        6.25
        
   step1: 将小数 转换为 二进制形式的小数         
       整数部分: (除2取余法)       
       0110   
       小数部分:(乘2取整法)     
       0.25 * 2 = 0.5  --- 0
       0.5  * 2 = 1    --- 1  
       乘到无小数

    //   ----> 注意永远是小数部分乘2  
    //
    //   eg:0.9准换为二进制
    //       0.9 * 2 = 1.8  --- 1
    //       0.8 * 2 = 1.6  --- 1
    //       0.6 * 2 = 1.2  --- 1
    //       0.2 * 2 = 0.4  --- 0
    //       0.4 * 2 = 0.8  --- 0
    //       0.8 * 2 = 1.6  --- 1 
        
       组合:
       0110.01 
   step2:将二进制形式的小数,写成科学计数法形式           
      1234.56 ---> 1.23456*10^3 //以十进制为例
      110.01  ---> 1.1001 * 2^2  //科学计数法形式 
 
   step3:按照 IEEE 754 标准 存放  
      
      1位 符号位|8位-指数位|尾数位 
                |          |
     
           0    |  2 + 127 |
                | -127~128 |
           0     1000 0001   1001 0000 0000 0000 0000 
                 
           0100 0000 1100 1000 0000 0000 0000 0000
            4     0   c   8      0   0    0    0    
练习:
      -12.25   ---->  注意只有整形才存在反补码转换,浮点型不论正负数,统一都是按上述步骤操作
      
      1100.01 
      
      1.10001 * 2 ^ 3
      
      
      1|3+127| 
      
      
      1100 0001 0100 0100 0000 0000 0000 0000 
       c     1   4    4    0    0    0    0 
            

双精度存储:

   符号位|指数位|尾数位
     1位 |  11位|52位  
          +1023

步骤同上


4、浮点型数据类型的大小:

因为任意精度浮点型足够大,所以一般可以随意用,不区分大小

         
5、浮点数的比较问题(精度问题),统一精度 
------------------------------------------------------------------------
下列代码执行结果为 no

  	float f = 0.9;
	if (f == 0.9)
	{
		printf("yes");
	}
	else
	{
		printf("no");
	}

原因:

浮点常量的类型: 默认识别为double类型,这里f是float类型,==后边的0.9是double类型,所以是 no
-------------------------------------------------------------------------



--------------------------------------------------------------------------
下列代码执行结果为 yes

  	float f = 0.9;
	if (f == 0.9f)
	{
		printf("yes");
	}
	else
	{
		printf("no");
	}

原因:

 0.9f //表示识别为 float类型 
-------------------------------------------------------------------------

进而还有:0.9L //L表示long double 
 
 整型常量:
 说明类型
 123L  //long int 
 123LL //long long int 
 123UL //unsigned long int 
----------------------------------

字符型的相关知识

 -------------------------------字符型----------------------------------

ASCII编码表与编码:

计算机只能存储0或1,字符要存储到计算机中需要对其进行编码,进而将其编码后的结果存入计算机中
我们可以在ASCII码表中找到常用字符的编码
  
eg:
a ---> 编码值 (数值) ---> 无符号的整数 
    
常量形式:
  'a'  //字符常量 

   ASCII码中的其他字符

变量形式:
  char ch; //tiny int(小整形)   这句话的意思就是说在电脑看来char型数据其实就是int型数据
signed ch
unsigned ch  

eg:char可以与int混用
      char ch1 = 'h';
      char ch2 = 'e';
      char ch3 = 'l';
      char ch4 = 'o';
  
      printf("%c%c%c%c%c\n",ch1-32,ch2-32,ch3-32,ch3-32,ch4-32); //大小写转换 加减32 
                                                                 //大写加32可转换为小写

数据类型的大小:

 unsigned char  [0~2^8-1]  //255
 signed char    [-128~127]


    
多个字符:
'abc' 相当于由多个字符的ASCII值组合起来(不是加)的数值

eg:
	printf("%#x %c\n",'abc','abc');   //0x616263    c
	printf("%#x %c",'abcd','abcd');   //0x61626364  d,因为是%#x,所以最多单引号里边四个字符 



    
ascii表:
0~32 控制字符 不可见,但是有效果,例如没有字符可以表示空格,但是按空格会出现效果
'0'~'9' //48~57
'A'~'Z' //65~90 
'a'~'z' //97~122 
'0'     //字符0,不是int的0

 练习


char c = '0';
printf("%d", c);  //获得字符0的十进制编码(48)
	

int a = 0;
printf("%c", a + 48); //已知整形0,打印字符‘0’

int a = 97;
printf("%c",a);    //打印ASCII码值为97的字符

  • 8
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值