01- 数据类型(C语言)

一 变量和常量

1.1 标识符

1、在我们所写的“第一个C程序”中出现了很多的标识符,例如includemainprintfreturn。标识符是⽤来标识变量函数,或任何其他⽤户⾃定义项⽬的名称
2、标识符的约束规范:

  • 只能包含数字、字母下划线
  • 不能以数字开头
  • 区分大小写

1.2 关键字

1. 当我们在使用C语言进行编程时,某些标识符会被用来表示特殊的含义或者作用并且不能用作他
用,我们就称这些标识符为关键字。
2. C语言提供了32个关键字:

  • 1) 数据类型关键字(12个)
    • charshortintlongfloatdoubleunsignedsignedstructunionenumvoid
  • 2) 控制语句关键字(12个)
    • ifelseswitchcasedefaultfordowhilebreakcontinuegotoreturn
  • 3) 存储类关键字(5个)
    • autoexternregisterstaticconst
  • 4) 其他关键字(3个)
    • sizeoftypedefvolatile

1.3 C语言中的数据类型

在实际开发过程中我们需要处理各种类型的数据,C语言提供的数据类型如下图所示:

1.4 常量

  • 在程序运行过程中,其值不能被改变的量
  • 常量一般出现在表达式或赋值语句中
  • 单引号是字符,双引号是字符串!!!

1.5 变量

变量的定义:

  • 我们可以把变量理解为一个存储数据的容器
  • 在程序运行过程中其值可以被改变
  • 变量在使用前必须要被定义
  • 变量定义的语法:type variable_list
    • 在这⾥,type 必须是⼀个有效的 C 数据类型,可以是 char、int、float、double 或任何⽤
      户⾃定义的对象,variable_list 可以由⼀个或多个标识符名称组成,多个标识符之间⽤逗号分隔。下⾯列出⼏个有效的声明:
int i, j, k;
char c, ch;
float f, salary;
double d;
  • 变量一旦被定义就在内存上占用了一块对应大小的空间

变量的命名规则

  • 遵循标识符的命名规范
  • 不能使用关键字
  • 见其名知其义,在实际开发过程中,我们一般建议使用英文单词或者英文单词的缩写作为变量名

常用变量名:

  • tmp:临时变量
  • cnt:计数器

二 整型:int

1. 各种整型类型的使用和对比

2. 可以通过 sizeof 关键字获取某个数据类型所占用的空间 

printf("%d\n", sizeof(short));  //2
printf("%d\n", sizeof(int));    //4
printf("%d\n", sizeof(long));   //4
printf("%d\n",sizeof(long long));  //8

3. 字节(Byte)和比特(bit)

  • bit位,即0或者1,0101010110
  • Byte字节,8位比特作为一个字节,字节是处理数据的基本单位
  • 1Byte= 8bits
  • 1KB = 1024Bytes
  • 1MB = 1024KB
  • 1GB =1024MB
  • 注意:B和b的区别

4. 数据总线

  • 输出数据
  • 总线的根数越多,数的表示范围也越大

5. 有符号数和无符号数取值范围

总结:软件开发过程中如果我们知道需要存储的数据不会为负数时,变量可以定义为无符号的整
数,这样可以扩大能够存储的最大正整数的值
6. 整型数据的表示 

7. 整型数据的打印格式 

#include <stdio.h>
int main()
{
    short a = 10;
    int b = 10;

    long c = 10l; //或者10L
    long long d = 10ll; //或者10LL
    printf("sizeof(a) = %u\n", sizeof(a));
    printf("sizeof(b) = %u\n", sizeof(b));
    printf("sizeof(c) = %u\n", sizeof(c));
    printf("sizeof(c) = %u\n", sizeof(d));
    printf("short a = %hd\n", a);
    printf("int b = %d\n", b);
    printf("long c = %ld\n", c);
    printf("long long d = %lld\n", d);
    unsigned short a2 = 20u;
    unsigned int b2 = 20u;
    unsigned long c2= 20ul;
    unsigned long long d2 = 20ull;
    printf("unsigned short a = %hu\n", a2);
    printf("unsigned int b = %u\n", b2);
    printf("unsigned long c = %lu\n", c2);
    printf("unsigned long long d = %llu\n", d2);
    return 0;
}

三 字符型:char 

1. 字符型变量用于存储一个单一字符
2. char 和 unsigned char 定义变量
3. 每个字符变量都会占用 1 个字节(1 Byte)
4. 用一对英文半角格式的单引号(' ')引用
5. 使用 %c 输出

#include <stdio.h>
int main()
{
    char ch = 'A';
    printf("char: %c\n", ch);
    return 0;
}

6. 字符在内存中存储时是以这个字符的ASCII编码进行存储的:

  • char的本质就是一个1字节大小的整型
char ch;
ch = 'A'; //ch

ASCII 码大致由以下两部分组成:

  • ASCII 非打印控制字符: ASCII 表上数字 0-31 分配给了控制字符,用于控制打印机等一些外围设备。
  • ASCII 打印字符:数字 32-126 分配给了能在键盘上找到的字符,当查看或打印文档时就会出现。数字 127 代表 Del 命令。

7. 大小写转换

  • 大写转小写:+32 / +0x20
  • 小写转大写:-32 / -0x20
#include <stdio.h>

int main(){
     //字符型数据
     char ch;
     ch = 'A';
     printf("char: %c\n", ch);  //A

    ch = 65;
    printf("65: %c\n", ch);  //A
    printf("65: %d\n", ch);  //65

    printf("A : %c\n", 'A');  //A
    printf("A -> a: %c\n", 'A'+32);  //a

    return 0;
}

8. 整数的字符形式

  • 整数转字符形式: +48 / +'0'
  • 字符形式转整数: -48 / -'0'

9. 转义字符

四 实型(浮点型):float、double

  • 实型变量也可以称为 浮点型变量,浮点型变量是用来存储小数数值的。在C语言中, 浮点型变量分为两种: 单精度浮点数(float)、 双精度浮点数(double), 但是double型变量所表示的浮点数比float 型变量更精确。
  • 由于浮点型变量是由有限的存储单元组成的,因此只能提供有限的有效数字。在有效位以外的数字将被舍去,这样可能会产生一些误差。
  • 不以f结尾的常量是double类型,以f结尾的常量(如3.14f)是float类型。
#include <stdio.h>
int main()
{
    //传统方式赋值
    float a = 3.14f; //或3.14F
    double b = 3.14;
    printf("a = %f\n", a);
    printf("b = %lf\n", b);
    //科学法赋值
    a = 3.2e3f; //3.2*1000 = 3200,e可以写E
    printf("a1 = %f\n", a);
    a = 100e-3f; //100*0.001 = 0.1
    printf("a2 = %f\n", a);
    a = 3.1415926f;
    printf("a3 = %f\n", a); //结果为3.141593
    return 0;
}

4.1 进制

进制也就是进位制,是人们规定的一种进位方法。 对于任何一种进制—X进制,就表示某一位置上的数运算时是逢X进一位。 十进制是逢十进一,十六进制是逢十六进一,二进制就是逢二进一,以此类推,x进制就是逢x进位。

4.1.1 二进制

二进制是计算技术中广泛采用的一种数制。二进制数据是用0和1两个数码来表示的数。它的基数为2,进位规则是“逢二进一”,借位规则是“借一当二”。

  • 当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的。
  • 十进制转化二进制的方法:用十进制数除以2,分别取余数和商数,商数为0的时候,将余数倒着数就是转化后的结果。
  • 十进制的小数转换成二进制:小数部分和2相乘,取整数,不足1取0,每次相乘都是小数部
    分,顺序看取整后的数就是转化后的结果。

五 计算机内存数值存储方式

1 在计算机系统中,数值一律用补码来存储

2. 补码的特点

  • 对于正数,补码就是原码(原始的二进制)
  • 对于负数,其补码为它的反码加1
  • 负数的反码:绝对值的原码取反
#include <stdio.h>
int main()
{
    int a = -15;
    printf("%x\n", a);
    //结果为 fffffff1
    //fffffff1对应的二进制:1111 1111 1111 1111 1111 1111 1111 0001
    //符号位不变,其它取反:1000 0000 0000 0000 0000 0000 0000 1110
    //上面加1:1000 0000 0000 0000 0000 0000 0000 1111 最高位1代表负数,就是-15
    return 0;
}

3. 经典笔试题

int a = 5;
unsigned int b = a-10;
printf("%d\n", a > b);

六 关于printf(“%f\n”,3/2)

通过运行程序我们发现程序的输出结果是 0 !!
我们首先要明白一个问题,在C语言里面,除数和被除数都是整数的时候,商的类型也是个整数。
比如这里的3/2,得到的不是1.5,而是下取整之后的结果1
我们知道整数1在内存中存储时的二进制为:0000 0000 0000 0000 0000 0000 0000 0001 ,可是
我们在输出结果时,计算机会将整个二进制当成浮点数来处理,那么问题来了:这个二进制所表示
的浮点数到底是多少呢?

下面,让我们来一起揭开浮点数存储的神秘面纱:

  • 浮点数的存储遵循的是 IEEE754 标准,任意一个二进制浮点数可以表示成下面的形式:

6.1 例1

已经浮点数的二进制形式,计算浮点是的十进制值:

6.2 例2

已知一个十进制浮点数,计算二进制形式:

在了解了浮点数在内存中的存储方式了以后,下面我们来看看1的二进制如果转换成浮点数会
是多少呢?
显然,符号为0,那么s为0
阶码E也为0,则指数e = 阶码E - 127 = -127
M是多少呢,很显然是2的-23次方,约等于0
所以最终的结果就为0啦 ~

猜你喜欢

转载自blog.csdn.net/March_A/article/details/131144809
今日推荐