C语言数据类型(计算机的简单介绍)

451 阅读9分钟

计算机的组成

计算机:俗称“电脑”,命名者希望计算机有一天能够像人一样,能够同人一起交流,所以命名为电脑。

计算机系统:一种能够按照事先存储的程序自动、高效的对数据进行输入、处理、存储和输出的系统。

计算机=软件+硬件,硬件:计算机系统中所有实体部件和设备的统称。

由中央处理器(CPU)、存储器和输入输出设备等核心部件组成。除此之外还有一些输入输出设备,比如输入设备:鼠标、键盘;输出设备:显示屏、打印机等。

在软件的配合下完成输入、处理、存储和输出等基本操作。

人们控制计算机的手段就是编写软件,软件-------计算机的思想和灵魂 | 硬件:计算机的肉体和躯壳。

程序与软件的区别:

  1. 程序:为了实现特定的目标或解决具体的问题,而使用计算机语言编写的指令的有序集合。
  2. 程序是否是软件的全部:不是。程序、数据、文档

人与计算机交流使用什么语言?

  • 计算机只能识别二进制指令

  • 机器语言

    • 用及其语言编写的一组机器指令的集合,称为机器代码,简称“机器码”。
    • 用一系列的二进制0和1组成的二进制代码代表不同的及其指令。可以说简单的1+1都是天书一般。

    因为二进制很难让人们所理解,于是出现了汇编语言,将01用一些语言来进行标记。

汇编语言:低级语言,与计算机硬件的距离的级别较低,对硬件依赖性强--------可移植性较差。

为了更好的与人机交流,于是出现了“高级语言”:有一个更高级别的编程;不依赖于硬件;远离了及其语言;具有可移植性。

如何将高级语言翻译成机器语言?编译型语言:解释型语言:就是将所有的程序执行完毕后再进行解释,java就属于解释型语言。逐字逐句的进行翻译,翻译一条执行一条。

高级语言的特点:既非英语,也不是机器语言,更像英语;高级语言程序必须通过编译器翻译成机器语言形式的目标代码,才能被计算机识别和执行;易学、易用、易懂、强大、可移植。

高级语言的发展历程:1954年约翰·巴克斯发明第一个高级语言FORTRAN,百家争鸣,据统计,不完全统计有2500种。但影响最大,寿命最长的非C语言莫属。在高级语言中,很多都是C语言发展过来的!

高级语言的分类

过程式语言:典型代表“C语言”,命令驱动,面向动作(语句),即将计算看做是动作(语句)的序列,程序由一系列的语句构成。

函数式语言:典型代表“LISP语言”,注重程序实现的功能,程序的编写过程是从已有函数出发构造出更复杂的函数,应用这些函数直至计算求得最终结果。

面向对象语言:典型代表“SmallTalk,c++,java”,程序的编写过程是直接从问题本身出发分析问题,并把数据和操作封装在一起构成对象,用数据描述对象属性,用对数据的操作描述对象行为。

逻辑式语言:典型代表“PROLOG”,基于规则的具有推理功能的语言。

阿兰·图灵:现代计算机科学之父的英国数学家。在计算机领域有一个奖项称之为图灵奖,相当于诺贝尔奖。

数据类型

数据是如何在计算机里面进行存储的?(冯·诺依曼计算机)

指令和数据同样存储在内存中;都以二进制形式存储在内存中。

对于计算机系统和本身硬件而言,数据类型的概念其实是不存在的。冯·诺依曼体系结构中,程序代码和数据以二进制进行存储。

引入数据类型的主要目的:

  • 有效的组织数据,把数据分成所需内存大小不同的数据
  • 规范数据的使用
  • 提高程序的可读性
  • 方便用户的使用

数据类型分类:

基本类型:

  • 整型: 基本整型:int、 长整型:long int、 短整型:short int、 无符号整型:unsigned。
  • 实型(浮点型): 单精度实型:float、 双精度实型:double、 长双精度实型:long double。
  • 字符型:char
  • 枚举类型:

构造类型:

  • 数组类型
  • 结构体类型
  • 共用体类型

指针类型:

空类型:

C语言程序中,有哪几种数据形式?

常量: 在程序中不能改变其值的量。

变量: 其值在程序执行过程中是可以改变的。

常量包括哪几种类型:

  • 在程序中不能改变其值的量。具体如下:

  • 包括:

  • 整型: 如:0,67(十进制整型),2,123L(后面有一个L表示长整型),123u(无符号整型),022(前面一个数字0表示八进制),0x12(前面加上数字0和x,表示十六进制数)

    • 默认为基本整型int
  • 实型: 如:2.3(十进制小数),1.2e-5(表示10的-5次方,指数形式),2.73F(表示的是单精度实型),2.73L(表示的是长双精度实型)

    • 默认为双精度实型double
  • 字符型: 如:'Z' , '3' , '$',字符两边用单引号引起来;

    • 字符串: 如:"uKM","5a","1"。两边用双引号引起来的称为字符串。
  • 枚举型:

如何声明变量的类型:

  • 变量的值在声明变量的过程中是可以改变的。

  • 变量的声明:

    • 类型关键字 变量名;

      main(){
          int a;//基本整型
          float b;//单精度实型
          char c;//字符型
          a = 1;
          b = 2.5;
          c = 'A';
      }
      
  • 使用变量的基本原则:变量必须先声明,后使用。

  • 一条声明语句可声明若干个同类型的变量

    • int a, b, c; 注:声明的顺序无关紧要!

如何给变量进行赋值:

  • 声明变量同时为变量赋值-----------变量的初始化。

​ a = 1; ​ b = 2.5; ​ c = 'A';

未被初始化的变量的值会是什么?

​ 其值为随机值(乱码)

  • 赋值表达式语句:变量 = 表达式;

规则:变量 <------ 表达式 左值和右值类型一致!

//正确的赋值方法
int a;                                
a = 0;        
//错误示范
 int a;//左右数据类型不一致
 a = 0.75;
  • 简单赋值 : 变量 = 表达式; 每个赋值表达式都有一个值。
  • 多重赋值:变量1 = 变量2 = 表达式; 相当于 变量1 = (变量2 = 表达式); 注:从右向左赋值
//值没有进行初始化,在这里的值是一个随机的值
int a,b;
float x,y;
//多重赋值语句
a = b = 0;  //这里的值是先赋值给b再赋值给a
x = y = 100.0;  //这里的值是先赋值给y,再给x

变量有哪些属性

  • 变量的值:保存在分配内存的空间里,变量分配多大的内存空间,取决于数据类型。
  • 变量名:声明变量的一个特定的字符。
  • 变量的地址:起始字节的地址作为变量的地址。
  • 变量的数据类型(变量被分配的内存大小)。

变量的类型决定了什么?

  • 占用内存空间的大小
  • 数据的存储形式
  • 合法的取值范围
  • 可参与的运算种类

不同类型数据占用的内存大小不同

  • int------基本整型,在大多系统上占4个字节;

  • short int-----短整型,简称short。2个字节;

  • long int------长整型,简称long,4个字节;

  • unsigned-------无符号整型(正整数和0),用来修饰int,short,long;

  • float--------单精度实型,4个字节;

  • double-------双精度实型,8个字节;

  • long double----------长双精度实型,系统相关。在vc++中占8个字节;

  • char---------字符型,1个字节。

不同类型数据的存储形式不同

  • Intel CPU上的整型数:分为
低位字节高位字节

前者为低位字节,后者为高位字节,如果是摩托罗拉的话就是两者相反

  • 实行数:

    • 定点数:小数点固定的数,如:12.36987

    • 浮点数(小数点可以浮动):小数点可以移动,幂会不相同;如:12.34567*10^0

      ​ 123456.7*10^-4

      ​ 1.234567*10^1

ANSI C未规定 3种浮点类型的长度,精度和表数范围;

有的系统用位来存储小数部分(尾数)

  • 增加了数值有效数字位数,提高了数值精度,但表数范围缩小

有的系统使用更多的位存储指数部分(阶码)

浮点数并非真正意义上的实数,只是在某种范围内的近似

字符型数据以二进制编码方式存储在内存中

  • 一个字节保存一个字符(英文字母,数字,控制字符)
  • 字符常数就是一个普通整数

字符编码方式取决于计算机系统所使用的字符集。

简单的算数运算和表达式

当变量赋值超出其表数范围的数值时,结果会怎样?

结果会溢出,得到一堆乱码。

数据溢出的危害?

  • 编译器对它熟视无睹
  • 在平台间移植时会出现问题,导致数据丢失或者溢出;
  • 当程序从高位计算机移向低位计算机移植(比如从64位系统移植到32位系统)时,可能会出现溢出。

对策:

  • 了解处理问题的规模,选择取值范围更大的变量类型
  • 同种类型在不同平台起占字节数不尽相同
  • 不要对变量所占的内存空间字节数想当然
  • 用sizeof获得变量或者数据类型的长度

整型:加、减、乘、除、求余

实型:加、减、乘、除

字符型:

  • 加、减(整数),乘除没有意义

  • 对ASCLL码值的运算

如何计算变量占内存空间的大小?

  • 用sizeof运算符。

  • C(sizeof)运算符,并非函数

    • 计算类型占用的字节数
  • 语法形式运算结果
    sizeof(类型)类型占用的字节数
    sizeof(表达式)表达式值所属类型占用的字节数C程序的开发工具:

    开发工具:

    Visual c++

    • Windows上最流行的C/C++集成开发环境之一

    Code::Blocks(简称CB)

  • 认识C语言从程序开始(经典案例):

第一个程序范例,打印“hello world!”。

#include <stdio.h>//以#开头,表示编译预处理指令;stdio,这里的io表示的是标准的输入输出,h(haid)表示的是头文件
main()//主函数,标准C都会有一个主函数
{
    printf("hello world!\n");//输出语句,最后有一个\n表示的是换行处理
}

考考你:如何吧"hello world!"分别打印在两行?

  • 有两种办法。1.在hello后面加上换行符\n;2.输出两条语句,首先输出hello,再输出一条语句world即可!

C程序中常见的符号有哪些

  • 关键字:又称保留字;例如:return,int都是关键字(保留字)

  • 标识符:

    • 系统预定义的标识符。比如函数名,变量名,printf。

    • 用户自定义标识符:变量名,函数名,··· ···

      1.运算符:

    • 算数运算符:+、-、*、/、%(求余)、++(自增)、--(自减)。

      • 关系运算符:

        ==检查两个操作数的值是否相等,如果相等则条件为真。
        !=检查两个操作数的值是否相等,如果不相等则条件为真。
        检查左操作数的值是否大于右操作数的值,如果是则条件为真。
        <检查左操作数的值是否小于右操作数的值,如果是则条件为真。
        >=检查左操作数的值是否大于或等于右操作数的值,如果是则条件为真。
        <=检查左操作数的值是否小于或等于右操作数的值,如果是则条件为真。
    • 逻辑运算符:

    &&称为逻辑与运算符。如果两个操作数都非零,则条件为真。
    ||称为逻辑或运算符。如果两个操作数中有任意一个非零,则条件为真。
    !称为逻辑非运算符。用来逆转操作数的逻辑状态。如果条件为真则逻辑非运算符将使其为假。
    • 位运算符:
    位运算符描述
    “按位与”运算符(&)参加运算的两个数据,按二进制位进行“与”运算。如果两个相应的二进制位都为1,则该位的结果值为1;否则为0。这里的1可以理解为逻辑中的true,0可以理解为逻辑中的false。
    “异或”运算符(^)若参加运算的两个二进制位值相同则为0,否则为1。
    “取反”运算符(~)这是一元运算符,用于求整数的二进制反码,即分别将操作数各二进制位上的1变为0,0变为1。
    左移运算符(<<)左移运算符是用来将一个数的各二进制位左移若干位,移动的位数由右操作数指定(右操作数必须是非负值),其右边空出的位用0填补,高位左移溢出则舍弃该高位。
    右移运算符(>>)右移运算符是用来将一个数的各二进制位右移若干位,移动的位数由右操作数指定(右操作数必须是非负值),移到右端的低位被舍弃,对于无符号数,高位补0。对于有符号数,某些机器将对左边空出的部分用符号位填补(即“算术移位”),而另一些机器则对左边空出的部分用0填补(即“逻辑移位”)。注意:对无符号数,右移时左边高位移入0;对于有符号的值,如果原来符号位为0(该数为正),则左边也是移入0。如果符号位原来为1(即负数),则左边移入0还是1,要取决于所用的计算机系统。有的系统移入0,有的系统移入1。移入0的称为“逻辑移位”,即简单移位;移入1的称为“算术移位”。
    • 赋值运算符:
    =简单的赋值运算符,把右边操作数的值赋给左边操作数C = A + B 将把 A + B 的值赋给 C
    +=加且赋值运算符,把右边操作数加上左边操作数的结果赋值给左边操作数C += A 相当于 C = C + A
    -=减且赋值运算符,把左边操作数减去右边操作数的结果赋值给左边操作数C -= A 相当于 C = C - A
    *=乘且赋值运算符,把右边操作数乘以左边操作数的结果赋值给左边操作数C *= A 相当于 C = C * A
    /=除且赋值运算符,把左边操作数除以右边操作数的结果赋值给左边操作数C /= A 相当于 C = C / A
    %=求模且赋值运算符,求两个操作数的模赋值给左边操作数C %= A 相当于 C = C % A
    <<=左移且赋值运算符C <<= 2 等同于 C = C << 2
    >>=右移且赋值运算符C >>= 2 等同于 C = C >> 2
    &=按位与且赋值运算符C &= 2 等同于 C = C & 2
    ^=按位异或且赋值运算符C ^= 2 等同于 C = C ^ 2
    |=按位或且赋值运算符C |= 2 等同于 C = C | 2
    • 杂项运算符----sizeof & 三元:
    sizeof()返回变量的大小。sizeof(a) 将返回 4,其中 a 是整数。
    &返回变量的地址。&a; 将给出变量的实际地址。
    *指向一个变量。*a; 将指向一个变量。
    ? :条件表达式如果条件为真 ? 则值为 X : 否则值为 Y

C中运算符的优先级:

类别运算符结合性
后缀() [] -> . ++ - -从左到右
一元+ - ! ~ ++ - - (type)* & sizeof从右到左
乘除* / %从左到右
加减+ -从左到右
移位<< >>从左到右
关系< <= > >=从左到右
相等== !=从左到右
位与 AND&从左到右
位异或 XOR从左到右
位或 OR|从左到右
逻辑与 AND&&从左到右
逻辑或 OR||从左到右
条件?:从右到左
赋值= += -= *= /= %=>>= <<= &= ^= |=从右到左
逗号,从左到右

2.空格符:

  • 空格、回车/换行、逗号等

3.其他符号:

  • {和}标识函数体或语句块
  • /* 和 */或//是程序注释的定界符

4.常量 常量值又称为字面常量,它是通过数据直接表示的,因此有很多种数据类型,像整型和字符串型等。