数据和C

数据和C

  1. 关键字:short,unsigned(无符号),_Bool,_Complex,_Imaginary

  2. 运算符--->sizeof()

  3. 函数--->scanf()处理用户输入流

  4. 整数类型和浮点数类型的区别


示例代码:

# include<stdio.h>

int main(void)
{
    float weight; // 体重
    float value; // 等体重白金价值

    printf("请输入你的体重:\n");
    /* 调用scanf()函数处理用户输入的数据 */
    scanf("%f", &weight); // 占位符%f表示读取用户从键盘输入的浮点数,&表示寻找变量的地址
    getchar(); // 读取换行符
    value = 1700.0 * weight * 14.5833;

    printf("体总换算出来的白金价值是:$%.2f\n", value); // %.2f表示输出小数点后两位数

    getchar(); // 退出程序

    return 0;
}

数据类型关键字

计算机的存储方式大致可分为两种:

  1. 整数类型
  2. 浮点数类型

在了解存储方式之前需要了解位、字节、字:(三者是描述计算机存储单元的术语)

  • 位(bit):最小的存储单元,可以存储0或1,是计算机内存的基本构建块
  • 字节(byte):常用的计算机存储单元,1字节为8位,这是字节的标准定义--->由于1位可以表示0或者1,那么8位就有2^8次方组合,可以表示256种组合,所以1字节便可以存储0~255的整数或者字符
  • :设计计算机时给定的自然存储单位,最初的微型计算机1字只有8位,后来发展有了16位,32位,到现在的64,计算机的字长越大,数据转移越快,允许的内存访问也越多

整数类型

整数类型的存储特点:

  1. 计算机以二进制存储整数

示例:

例如存储7这个数,计算机会把7转为二进制111,然后以一个字节存储,那么一个字节是8位,前五位设置成0,后三位设置成1这样一个7就存储好了

浮点数类型

浮点数类型的存储特点:

  1. 计算机把浮点数分成小数部分指数部分来表示
  2. 小数部分和指数部分是分开存储的
  3. 由于在任何区间内(1.0~2.0之间)都存在无穷多个实数,所以计算机的浮点数不能表示区间内的所有值,浮点数通常只是实际值的近似值(如7.0近似值为6.99999),所以浮点数的算术运算会损失更多的精度

变量的声明和赋值

特点:

  1. 声明操作为变量创建和标记内存空间
  2. 赋值操作为变量指定初始值

不同进制

不同进制的显示:

  1. 十进制整数:%d--->显示前缀:%d
  2. 八进制整数:%o--->显示前缀:%#xo
  3. 十六进制整数:%x--->显示前缀:%#x

整数溢出:

示例代码:

# include<stdio.h>

int main(void)
{
    /* 声明一个整数,该整数大于计算机最大的整数存储范围 */
    int i = 2147483647;
    /* 声明一个非负整数,也是大于计算机最大的非负整数存储范围 */
    unsigned int j = 4294967295;

    // 打印上述两个数观察结果
    printf("%d, %d, %d", i, i+1, i+2);
    printf("%u, %u, %u", j, j+1, j+2); // %u是非负整数的占位符, 打印long类型整数就用%ld

    getchar();

    return 0;
}

小结:

  1. 无符号整数,超过表示的最大值时,重新从起始点开始表示(0,1)
  2. 有符号整数,超过表示的最大值时,-2147483648开始表示

short,long,long long,unsigned的表示:

示例代码:

# include<stdio.h>

int main(void)
{
    unsigned int un = 3000000000; // int 为32位和short为16位的系统
    short end = 200;
    long big = 65537;
    long long veryBig = 12345678908642;

    // 打印这些数
    printf("un = %u, 不是: %d\n", un, un); // 无符号的un用%d表示会得到负值,因为un的表示和-129496296表示相同,如果告诉pringtf打印无符号是正值,如果是有符号会是另一个值
    printf("end = %hd, 也可以是: %d\n", end, end); // %hd表示short的占位符,如果操作系统位数不同的话可以用%d表示,long也是如此
    printf("big = %ld, 不是: %hd\n", big, big); // long类型的占位符用%ld表示
    printf("veryBig = %lld, 不是: %ld\n", veryBig, veryBig);

    getchar();

    return 0;
}

打印字符:

# include<stdio.h>

int main(void)
{
    // 声明一个字符,同时使用字符打印和十进制整数打印,观察字符在内存当中的存储方式
    char ch;

    printf("输入你希望打印的字符:\n");
    scanf("%c", &ch); // 字符的占位符是%c
    getchar();
    printf("字符%c的十进制表示数是:%d", ch, ch);
    getchar();

    return 0;
}

小结:

  1. 字符C会根据其对应的编码转为int类型数据,存入一字节的存储空间中(8位)

  2. printf()函数中的转换决定了数据的显示方式而不是数据的存储方式

  3. 有些编译器把char定义为有符号,存储范围是-128~127.有些编译器把char定义为无符号,存储范围是0~255,编译器具体把char定义为什么样子可以查询编译器手册,或者在limits.h头文件中查看

显示可移植类型:

# include<stdio.h>
# include<inttypes.h> // 支持可移植类型

int main(void)
{
    /* 声明一个32位有符号的整型变量 */
    int32_t me32;

    me32 = 45933945;
    printf("常规输出int32类型:\n");
    printf("me32 = %d\n", me32);

    // 使用字符串宏显示可移植类型
    printf("me32 = %" PRId32 "\n", me32); // C可以把多个连续的字符串组合成一个字符串
    // 在inttypes.h宏文件中把`PRID32`定义为了字符"d"
    // 所以上述输出等价于printf("me32 = %d\n", me32);

    getchar();

    return 0;
}

float、double、long double

  • float

特点:

  1. float类型必须至少能表示6位有效数字,取值范围至少是10^-37~10^37
  2. 存储一个float类型数据占位32位,8位表示指数值或符号,24位表示非指数部分
  • double(双精度)

特点:

  1. 至少表示10位有效数字
  2. double占用64
  • long double

特点:

  1. 至少与double类型的精度相同

特殊示例:

如果编译器假定浮点型常量是double类型的精度,那么4.02.0被存储为64位的double类型,使用双精度进行乘法运算,乘积会被截断成float类型的宽度.(计算精度更高,但是速度更慢)

打印浮点数示例代码:

# include<stdio.h>

int main(void)
{
    float aboat = 32000.0;
    double abet = 2.1439; // 科学计数法
    long double dip = 5.32e-5;
    
    printf("%f 能被写成: %e\n", aboat, aboat);
    printf("%a ...\n", aboat);
    printf("%f 能被写成: %e\n", abet, abet);
    printf("%Lf 能被写成: %Le\n", dip, dip);

    getchar();

    return 0;
}

浮点数舍入错误示例代码:

# include<stdio.h>

int main(void)
{
    float a, b;

    b = 2.0e220 + 1.0;
    a = b - 2.0e20;

    printf("a = %f\n", a);

    getchar();

    return 0;
}

浮点数舍入错误原因小结:

计算机缺少足够的小数位来完成正确的当前运算

float类型存储6~7位有效数字,2.0e20表示2后面有200,把该数+1发生变化的在第21位,所以必然会计算错误

内置运算符sizeof:

作用:

  1. 以字节为单位返回指定类型的大小
  2. 占位符是%zd

刷新输出:

printf()语句把输出发送到一个缓冲区,缓冲区中的内容在被不断地发送到屏幕上.

缓冲区发送的条件:

  1. 当缓冲区满
  2. 遇到换行字符或需要输入的时候
posted @ 2023-04-16 22:16  俊king  阅读(46)  评论(0)    收藏  举报