C语言:基本类型数据

目录

整型数据

用来存放整型数据的变量

整型数据在内存中的存储形式

案例

浮点型数据

浮点型变量的分类

浮点型数据在内存中的存储形式

案例

字符型数据

字符数据在内存中的存储形式

案例

案例


整型数据

用来存放整型数据的变量

定义整型变量,C语言编译系统在内存内分配了一个存储整型数据的存储空间。用变量名标识。通过变量名访问该空间。

通过sizeof查询分配的存储空间的大小,如:

 int a = 10;
 ​
 printf("%d,%d\n",sizeof(int),sizeof(a)); 
   
 //sizeof返回的大小是以字节为单位,返回类型long unsigned
整型数据在内存中的存储形式
  • 数据在内存中是以二进制形式补码存放

 short i;    //定义i为一个存储整型的变量 2字节

 i = 10;

 printf("%d\n",i);

则十进制数10的二进制数形式为1010,整数10在内存中的实际存储形式

为:

  • 实际上:整型数据在内存中是以补码的形式表示,为了统一加减法运算

  • 程序中的数据直接转换出来的二进制是原码形式

    • 正数的补码和原码相同,三码唯一

    • 负数的补码是将该数绝对值的二进制形式,针对数据位按位取反+1(反码+1为补码)

内存数据的读写

① 向内存存数据(二进制形式):程序原始数据 → 二进制原码 → 二进制反码 → 二进制补码

② 从内存取数据(二进制形式):二进制补码 → 二进制反码 → 二进制原码 → 程序原始数据

案例

需求:整型变量的定义和使用

 
/*************************************************************************
   > File Name:    demo03.c
   > Author:       三道渊
   > Description:  
   > Created Time: 2025年07月09日 星期三 14时54分57秒
  ************************************************************************/
 ​
 #include <stdio.h>
 ​
 int main(int argc,char *argv[])
 {
     // 定义有符号整型变量,可以存放正数、0、负数,默认就是有符号数
     int a,b,c,d;  // 等价于 signed int a,b,c,d;
 ​
     // 定义无符号整型变量,可以存放正数、0,不能存放负数,必须添加关键 unsigned
     unsigned int u;
 ​
     // 赋值
     a = 12;
     b = -24;
     u = 10;
     c = a + u, d = b + u;
     printf("a+u=%d,b+u=%d\n",c,d); // a+u=22,b+u=-14
     // 注意:计算机硬件支持加法运算,不支持减法运算,我们程序中的减法运算,实际上是有负数参与的加法运算,比如5-2实际上5+(-2)
 ​
     return 0;
 }
 

有符号和无符号数在内存中的存储形式(以char类型举例):

有符号char的范围:-128 ~127

无符号char的范围:0 ~ 255

浮点型数据

定义:用来表达实数(小数)的数据类型。

浮点型变量的分类
  • 单精度浮点型(float):在64位系统中尺寸是4字节,精确到小数位6位,格式化符号 %f

  • 双精度浮点型(double):在64位系统中尺寸是8字节,精确到小数位15~16位,格式化符号 %lf

  • 长双精度浮点型(long double):在Linux下64位尺寸是16字节。

注意:占用内存越多,能表示的精确度越高。

 float f1 = 12.25f;     // 单精度
 double f2 = 12.5;      // 双精度
 long double f3;        // 长双精度
浮点型数据在内存中的存储形式

浮点型数据在内存中按照指数形式(IEEE 754标准)存放。系统将一个浮点型数分成尾数部分指数部分,分别存放。

举例:

1234.5 → 1.2345*10^3 → 1.2345e3

类别字节数符号位指数位(指数部分)尾数位(小数部分)指数偏移量
单精度浮点数41位[31]8位[30~23]23位[22~00]127
双精度浮点数81位[63]11位[62~52]52位[51~00]1023

float内存示意图:

案例
  • 需求:写出27.5f在内存中的存放形式

  • 解析:

    • 27.5f的二进制为11011.1

    • 转换为指数形式:11011.1 → 1.10111*2^4

    • 指数:4 + 127 = 131,转换为二进制:1000 0011

    • 尾数:10111,需要补够23位,右侧补0:1011 1000 0000 0000 0000 000

      浮点型数据如何转二进制?

      ① 整数部分:采用辗转除2直到出现小数为止。

      ② 小数部分:采用辗转乘2直到整数位出现1,小数位出现0为止,但是有时候会出现乘不尽的情况,此时需根据内存大小来决定保留位数。

    • 用二进制表示就是符号位(1位)、指数位(8位)、尾数位(23位),最终显示:

                

※ 科学计数法(指数法):

C语言中一般浮点数有两种表示形式:

  • 十进制形式:指的是数字必须以整数形式+小数形式组成,比如 10.0 、3.14 ......符合规则,以10为底数,并且科学计数法要在范围值之内。

  • 指数形式(科学记数法):一般数学上对于小数可以以10为底进行表示 比如3.14 * 10²,但是在使用英文半角输入法的时候没办法输入上底或者下底,所以C语言规定以字母e或者E来表示指数,并且要求字母e或者E的前面必须有数字,字母e或者E的后面必须为整数。 -3.14E-2 2E-3 0.3E4

          printf("%e", 10000000.00);

所以:E3 错误 因为E的前面有数据 比如说 3.14E3

3.1e5.6 错误 因为 E的后面必须是整数

3.1e-2 对的 相当于 3.1 * 10^{-2}

1.01e-5 等价于 1.01*10^{-5}

字符型数据

概念:字符型变量用来存放字符常量。

定义:

 char 变量列表;

举例:

 char a = 'A';   
 char b = a;

举例:

 /*************************************************************************
   > File Name:    demo04.c
   > Author:       三道渊
   > Description:  
   > Created Time: 2025年07月09日 星期三 16时43分02秒
  ************************************************************************/
 ​
 #include <stdio.h>
 ​
 int main(int argc,char *argv[])
 {
     char c1,c2;
 ​
     c1 = 'A';
     c2 = 'B';
 ​
     printf("c1=%c\n",c1);// A %c是字符的格式化符号
     printf("c1=%c\n",c2);
     printf("c1=%d\n",c1);
     printf("c2=%d\n",c2);
 ​
     return 0;
 }
 

运行结果:

说明:

一个字符变量只能存放一个字符。C编译系统规定以一个字节的存储空间来存放一个字符,因此,一个字符变量在内存中的大小是1个字节(1字节 = 1字符)

字符数据在内存中的存储形式

将一个字符常量存入一个字符变量,实际上并不是把该字符本身存入内存中,而是将该字符对应的ASCII(系统内置)码存入内存单元。

范例:

  • 需求:char c1 = 'a', c2 = 'b';

  • 分析:

    • 'a'的ASCII为97'b'的ASCII码为98,它们在内存中的存储形式:

      进一步理解,实际上是按照ASCII码的二进制形式存放,形式为:

由此可见,在内存中字符数据的存储形式与整型数据类似,这就使得字符型数据和整型数据之间可以通用,也就是1个字符数据既可以以字符形式输出,也可以以整数形式输出。

  • 以字符形式输出时,编译系统将内存单元中的ASCII码转换为相应的字符,然后输出。

  • 以整型输出时,直接将ASCII码作为整数输出。

  • 因此,可以对字符数据进行算数运算,这时相当于对其ASCII码进行算数运算。

案例
  • 要求:给字符变量赋整数值

        
    
        /*************************************************************************
          > File Name:    demo03.c
          > Author: FPF
          > Description:  字符型数据
          > Created Time: 2025年01月21日 星期二 16时05分09秒
         ************************************************************************/
        
        #include <stdio.h>
        
        int main(int argc,char *argv[])
        {
            char c1,c2;
            c1 = 97;// char既能赋值字符,也能赋值整数(ASCII码)
            c2 = 98;
        
            printf("%c %c \n",c1,c2);// a b, 以字符形式输出
            printf("%d %d \n",c1,c2);// 97 98, 以整数形式输出
        
            return 0;
        }
        

说明:char类型可以赋值为字符,也可以赋值为整数(char a = 128,显示的结果范围:-128~127),演示案例:

c1在内存的存储形式以及不同形式的输出,如下图所示:

案例
  • 需求:大小写字母转换

  • 代码:

      /*************************************************************************
       > File Name:    demo06.c
       > Author:       三道渊
       > Description:  
       > Created Time: 2025年07月09日 星期三 17时21分58秒
      ************************************************************************/
     ​
     #include <stdio.h>
     ​
     int main(int argc,char *argv[])
     {
         char c1,c2;
     ​
         c1 = 'm';
         c2 = 'Y';
      
         printf("转换前:%c,%c\n",c1,c2);
     ​
         // 转换
         c1 = c1 - 32;
         c2 = c2 + 32;
     ​
         printf("转换后:%c,%c\n",c1,c2);
     ​
         return 0;
     }
    
    
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值