一、C语言的数据类型
思考:既然用户申请存储单元的时候要说明存储单元的大小,请问如何让计算机知道大小???
回答:C语言中提供了一些关键字,专门用于表示数据的类型,其实就是用于表示要申请的内存空间的大小。
思考:已知计算机只认识二进制,也就是数据都是以二进制形式存储到内存中,请问为什么还需要这些关键字来表示数据的类型?
回答:程序是给人看的,这些关键字是用于提高程序可读性的,另外这些关键字也是说明数据的宽度的(占几个字节)。
(1) 字符型
C语言标准中提供了一个关键字char,其实是character单词的缩写,表示字符的意思,操作系统char类型的数据宽度定义为1字节,用于存储字符,C语言标准中用单撇号’ ’表示字符。
C语言标准规定:用户打算存储字符 数据宽度 变量名称 ; 举例: char ch = ‘c’ ;
C语言标准中关于字符的种类有两种:普通字符 and 转义字符,对于ASCII码表中转义字符
注意:ASCII码中的转义字符需要使用 ‘\0’ ‘\r’ ‘\n’进行表示,代表字符具有特殊的意义。
思考:已知计算机是以二进制存储数据,意味着写入到存储器中的字符都会被编译器转换为而二进制指令,那请问用户能否直接以二进制指令的形式把字符输入到存储器中,编译时是否会报错??
回答:会报错,因为C语言不支持二进制输入,但是C语言支持八进制、十进制、十六进制。
(2) 整数型
C语言标准中使用关键字int表示整数,关键字int的英文单词是integer,对应的中文具有整数的含义,在32系统下关键字int的数据宽度是4字节,也就意味着存储单元所能存储的整数范围比较广泛。
C语言标准规定了用户可以采用不同的进制来表示数据,常用的进制有八进制、十进制以及十六进制,并且为了区分这三种进制,所以规定每种进制都有对应的前导符(前缀),规定八进制的前缀以0表示,比如064,规定十六进制的前缀以0x/0X表示,比如0x64。
(3) 短整型
C语言标准中规定使用关键字short来表示短整型,一般短整型的全称是short int,只不过写程序的时候可以只写short即可,在32位系统下short短整型占2字节。2^16=65536
(4) 长整型
C语言标准中规定使用关键字long来表示长整型,一般长整型的全称是long int,只不过写程序的时候可以只写long即可,在32位系统下long长整型占4字节,在64位系统占8字节。
(5) 长长整型
C语言标准中规定使用关键字long来表示长整型,但是长长整型是使用long long来表示,在32位和64位系统下长长整型占8字节。
思考:C语言中提供了char、int、short、long、long long来表示整型,但是整型数是分正负的,编译器如何来区分整数的正负呢?
回答:C语言标准中提供了两个关键字 signed && unsigned用于修饰整数,unsigned表示无符号,signed表示有符号,C语言中的signed修饰符是隐式声明,也就是用户定义整型变量的时候如果没有特别强调,则整型变量默认是有符号的。
用户如果要存储无符号的整数,则必须定义变量必须显式声明变量是无符号的(unsigned)。
思考:计算机可以区分整数的正负,但是程序最终都会被转换为二进制指令,但是二进制是不分正负的,请问编译器是如何转换数据的???
回答:二进制可以分正负,在二进制数的前面添加1bit,作为符号位,并且bit=0,用于表示二进制数为正数,bit=1,用于表示二进制数为负数。
可以知道,计算机内部是以二进制的补码方式来存储数据的,所以需要把二进制数的原码转换为补码形式。
可以知道,正数的原码和补码是相同的,所以负数才需要把原码转换为补码,再进行存储!
反码:二进制数除了符号位(二进制数中的最高位),把数据位取反即可(0变1,1变0)。
-1 --- 1 000 0001 原码 -- 计算反码 -- 1 111 1110 反码
补码:二进制数的反码 + 1
-1 -- 1 000 0001 原码 --计算反码 -- 1 111 1110 反码--计算补码 -- 1111 1110 +1 -- 1111 1111

练习:用户打算定义一个字符型变量,命名叫做data,准备把一个正整数存储到变量data中,并设计了一段程序,请问这段