云计算百科
云计算领域专业知识百科平台

C语言基本类型数据

基本类型数据(重点)

整形数据

整型变量的定义与内存查询

定义整形变量时,编译器会分配对应大小的内存空间,变量名作为该空间的标识,通过变量名可访问空间中的数据。

若不确定编译器分配的内存大小,可通过sizeof运算符查询(sizeof返回值的类型为size_t,也就是unsigned long int的别名,通常用%ld格式化输出)

int a = 10;
//输出:4,4 int类型占4字节,变量a使用int修饰,占4字节 sizeof返回的是size_t类型的字节数
printf("%ld,%ld\\n",sizeof(int), sizeof(a));

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

  • 存储本质:数据在内存中是以二进制形式存储,最终以补码形式存放 。
  • 补码的使用:统一加减法运算,使CPU可通过同一套加法电路(简化硬件设计)处理所有整数运算(包括正数、负数),同时消除了+0和-0歧义,只保留一个0。

关键概念

  • 程序中的数据转换为二进制后,默认是原码形式。

  • 正数的原码、反码、补码完全相同(三码一致)。

  • 负数的补码计算:先取该数绝对值的原码 → 按位取反(得到反码) → 加 1(得到补码)。

内存数据的读写流程:

① 存数据:正数直接以补码存储;负数需经过 原码 → (按位取反) → 反码 → (+1) → 补码转换后存储。

② 取数据:正数补码直接还原为原码;负数需经过补码 → (-1) → 反码 → (按位取反) → 原码后还原(八进制/十进制/十六进制)

示例:整型变量的定义与运算

#include <stdio.h>

int main(int argc,char *argv[])
{
// 有符号整型变量:可存放正数、0、负数,默认类型(等价于signed int)
int a, b, c, d;
// 无符号整型变量:仅可存储正数、0、不能存储负数,需加unsigned关键字
unsigned int u, v;

// 赋值
a = 12;
b = 24;
u = 10;
c = a + u; // 12 + 10 = 22
d = b + u; // -24 + 10 = -14
v = 100;
printf("a+u=%d,b+u=%d,v=%u\\n", c, d, v);// %d:有符号int, %u:无符号int,v不接受负数,所以获取到的是随机值

return 0;
}

运行结果

a+u=22,b+u=14,v=4294967196

补充:有符号与无符号char的存储范围对比(以 8 位为例):

  • 有符号char:范围-128 ~ 127(最高位为符号位,0 表示正数,1 表示负数);
  • 无符号char:范围0 ~ 255(所有位均为数据位,无符号位)。

浮点型数据

**定义:**用于存储实数(小数)的数据类型,支持整数部分和小数部分的表示。

浮点型变量的分类
类型字节数(64 位系统)精度(有效数字)格式化输出符号说明备注
单精度型 float 4 字节 6~7 位 %f 需在常量后加F/f(例:12.25f)
双精度型 double 8 字节 15~16 位 %lf(或%f,printf 通用) 默认浮点型常量为double(例:12.5)
长双精度型 long double 16 字节(Linux GCC) 18~19 位 %Lf 精度最高,兼容性依赖编译器

注意:占用内存越大,精度越高,能表示的数值范围也越广。

float f1 = 12.25f; // 12.25f表示float类型的常量,推荐加F,语法上允许省略f/F,但会触发double->float的隐式转换
double f2 = 12.5; // 12.5表示double类型的常量,默认
long double f3 = 3.1415926535Lf; // 3.1415926535Lf表示long double类型的常量,建议少用,加Lf

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

浮点型数据按IEEE 754标准以二进制指数形式存储,系统将浮点型数据拆分为三部分分别存放:

  • **符号位:**表示正负(0-正,1-负)
  • **指数位:**存储指数值(需加偏移量,避免负指数)
  • **尾数位:**存储尾数部分(隐含整数部分为1,节省存储空间)
  • 举例:1234.51234.51234.5的指数形式为1.2345∗1031.2345 * 10^31.2345103(或1.2345e31.2345e31.2345e3

    IEEE 754标准相关参数:

    类别字节数符号位指数位(范围)尾数位(长度)指数偏移量
    单精度浮点数 4 1 位 [31] 8 位 [30~23] 23 位 [22~00] 127
    双精度浮点数 8 1 位 [63] 11 位 [62~52] 52 位 [51~00] 1023
    示例:27.5f 在内存中的存储形式
    • **需求:**分析单精度浮点型数27.5f的内存存储二进制形式。
    • 解析步骤:
    • 转换为二进制:27.5的二进制为11011.1(整数部分27→1101127 → 110112711011,小数部分 0.5→10.5 → 10.51
    • 标准化指数形式:11011.1=1.10111∗2411011.1 = 1.10111 * 2^411011.1=1.1011124(小数点左移4位,指数为4)
    • 计算指数位:指数(4) + 偏移量(127) = 131,转换为8位二进制1000 0011
    • 处理尾数位:尾数部分为10111,(隐含整数部分 1),补0 → 1011 1000 0000 0000 0000 000
    • 组合结果:符号位(0-正数) + 指数位(10000011) + 尾数位(10111000000000000000000)

    补充:浮点型数据转二进制方法:

    ① 整数部分:辗转除以 2,取余数,逆序排列(直到商为 0);

    ② 小数部分:辗转乘以 2,取整数位,顺序排列(直到小数部分为 0 或达到尾数位长度,乘不尽时按精度截断)。

    科学计数法(指数形式)规则

    C 语言中浮点数的两种表示形式:

    • 十进制形式:需包含整数部分或小数部分至少其一(例:10.0 、3.14 、.14 、10. 均合法;仅“.”不合法)

    • 指数形式(科学计数法):用e或E

      表示 10 的幂次,规则如下:

    • e/E前面必须有数字(例:3.14e3合法,e3非法);
    • e/E后面必须是整数(可正可负,例:3.1e-2合法,3.1e5.6非法);
    • 示例:-3.14E-2(等价于-3.14×10⁻²)、2E-3(等价于2×10⁻³)、0.3E4(等价于0.3×10⁴)。

    // 以指数形式输出浮点数,%e为指数形式格式化符号
    printf("%e\\n", 10000000.00); // 输出:1.000000e+07

    字符型数据

    **概念:**字符型变量用于存储单个字符常量(查看ASCII字符集)

    定义格式:

    char 变量列表;

    基础示例

    char a = 'A'; // 赋值字符常量(单引号括起)
    char b = a; // 赋值字符变量

    示例:字符型常量的输出形式

    #include <stdio.h>

    int main(int argc,char *argv[])
    {
    char c1,c2;
    c1 = 'A'; // 赋值字符常量
    c2 = 66; // 赋值字符常量对应的ASCII码

    // %c:以字符形式输出(将ASCII码转换为对应字符)
    printf("c1=%c\\n", c1); // c1=A
    printf("c2=%c\\n", c2); // c2=B

    // %d:以整数形式输出(直接输出ASCII码值)
    printf("c1=%d\\n", c1); // c1=65(A 的 ASCII码是 65)
    printf("c2=%d\\n", c2); // c2=66(B 的 ASCII码是 66)

    return 0;
    }

    注意:如果给char赋值整数,需要考虑赋值的整数范围,因为标准ASCII的范围是0~127

    核心说明:

    • 字符变量仅能存放单个字符(ASCII 字符),汉字、中文符号等占多字节的字符无法存放;
    • C 编译器为字符变量分配 1 字节内存(1 字节 = 1 个 ASCII 字符);
    • 字符常量存储本质:存入字符对应的 ASCII 码值(而非字符本身),因此字符型数据与整型数据可通用。
    字符数据在内存中的存储形式

    将字符常量存入字符变量时,实际存储的是该字符的 ASCII 码值(二进制形式)。

    范例:char c1 = 'a', c2 = 'b';

    • 'a'的 ASCII 码为 97,'b'的 ASCII 码为 98;
    • 内存中以二进制形式存储:
    字符型与整型的通用性

    因字符数据本质是 ASCII 码(整数),故字符型与整型可通用:

    • 字符型变量可赋值为整数(ASCII 码值),也可赋值为字符;
    • 字符数据可参与算术运算(本质是 ASCII 码的运算);
    • 输出形式灵活:%c以字符形式输出,%d以整数形式输出。

    说明:有符号char的取值范围为-128~127,若赋值超出范围(如128)会发生溢出(属于未定义行为);主流编译器通常按“模256循环”处理(128对应-128,129对应-127),但结果不具备跨编译器兼容性。

    示例:大小写字母转换(利用ASCII码运算)
    • 原理:ASCII中,大写字母对应相应的小写字母相差32(例如:‘A’ = 65, ‘a’ = 97)

    • 转换规则:

      • 大写转小写:大写字母 + 32 = 小写字母
      • 小写转大写:小写字母 – 32 = 大写字母
    • 代码:

      #include <stdio.h>

      int main(int argc,char *argv[])
      {

      char c1, c2;

      c1 = 'm'; // 小写转大写
      c2 = 'Y'; // 大写转小写

      printf("转换前:%c,%c\\n", c1, c2); // 输出:m,Y

      // 转换
      c1 = c1 32; // 将原本c1的值 – 32,一个char在参与数学计算的时候,会自动转换为int
      c2 = c2 + 32;

      printf("转换后:%c,%c\\n", c1, c2); // 输出:M,y

      return 0;
      }

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » C语言基本类型数据
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!