字符类型的名称是char 字符类型里包含256个不同的整数,每个 整数对应一个字符(例如'a', '^'等) 这些整数和字符完全可以互相替代 ASCII码表列出所有整数和字符的对应关系 'a' 97 'A' 65 '0' 48 ASCII码表里所有小写英文字母是连续排列的, 其中'a'对应的整数最小,'z'对应的整数 最大 所有大写英文字母和阿拉伯数字字符也都符合 这个规律 'd' - 'a' 等于 'D' - 'A' 'd' - 'a' 等于 '3' - '0' 等于 3 - 0 所有字符数据被分成两组,每组包含128个 其中一组字符对应的整数在所有计算机上都 一样,这些整数的范围从0到127 另外一组字符对应的整数在不同计算机上有可能 不同,这些整数的范围可能从-128到-1也 可能从128到255 '\n' 换行字符 '\r' 回车字符 '\\' 代表字符\ '\'' 代表字符' '\"' 代表字符" 短整数类型名称是short 它里面包含65536个不同的整数,其中一半是 负数,另外一半是非负数。这些数字以0 为中心向两边扩展。 长整数类型名称是long 它里面包含2的32次方个不同的整数,其中 一半是负数,另外一半是非负数。这些 数字以0为中心向两边扩展。 整数类型名称是int 在我们的计算机里整数类型和长整数类型 完全一样 以上类型都叫做有符号类型 每个有符号类型都有一个对应的无符号类型, 无符号类型的名称就是在对应有符号类型 名称前加unsigned(例如unsigned char, unsigned int等) 无符号类型包含的数字个数和对应的有符号 类型一样,但是不包含负数 整数相关类型所包含的数字范围互相重叠并 逐渐扩大 程序中不带小数点的数字后加u表示这个数字 的类型是无符号整数类型 C语言里用浮点类型表示带小数点的数字 浮点类型分为单精度浮点类型和双精度浮点类型 双精度浮点类型可以记录更多小数点后面的数位 单精度浮点类型的名称是float 双精度浮点类型的名称是double 程序中带小数点的数字默认都是双精度浮点 类型的 如果在带小数点的数字后加f就表示这个数字的 类型是单精度浮点类型 C语言里可以创建新的数据类型 这些新的数据类型叫做复合数据类型 复合数据类型必须先创建出来然后才能使用 C99规范里引入布尔类型 布尔类型里只包含两个数字,一个叫真另外 一个叫假。真用1表示,假用0表示。 真和假都叫做布尔值 所有整数都可以当作布尔值使用,0当作布尔值 使用的时候是假,其他所有整数当布尔值 使用的时候都是真 一般在程序里不需要使用布尔类型,直接用 整数类型代替 数据类型和占位符的对应关系 char和unsigned char %c short %hd unsigned short %hu long %ld unsigned long %lu int %d unsigned int %u float %f或%g double %lf或%lg %f或%lf会保留小数点后 无效的0,%g和%lg不会保留 不同类型存储区所包含的字节个数可能不同 sizeof关键字可以用来计算一个类型的存储区 所包含的字节个数 char和unsigned char 1个字节 short和unsigned short 2个字节 int和unsigned int 4个字节 long和unsigned long 4个字节 float 4个字节 double 8个字节 sizeof关键字小括号里可以写任何能当作 数字使用的内容 sizeof小括号里对任何存储区内容的修改不会 真正发生 scanf标准函数可以用来从键盘得到用户临时 输入的数字 为了使用这个标准函数需要包含stdio.h头文件 scanf函数调用语句里要使用存储区的地址 表示存储区 双引号里使用占位符表示存储区的类型 不要在scanf函数调用语句的双引号里写不是 占位符的内容 如果用户输入的内容不符合程序中要求的格式 程序就不能得到数字 可以在一条scanf函数调用语句里得到多个数字, 这个时候要提供多个存储区地址 一个字节分成八段,每段只能记录一个0或者1 要想把一个数字记录到一个字节里就需要首先 把这个数字拆分成八个0或者1 用一组0或者1表示数字的方法叫做二进制 任何一个数字既可以用十进制方式表示也可以 用二进制方式表示 计算机里只能记录二进制方式表示的数字 二进制表示方式里包含很多数位,每个数位 有一个编号。最右边数位的编号是0,向左 依次递增。 某个数位里的1代表的数字是2的数位编号次方 二进制表示方式中如果两个相邻数位的内容一样 则左边数位代表的数字是右边数位代表 数字的2倍 二进制表示的非负数符合以上规则 二进制数字加一的时候需要把编号0位置开始的 连续多个1都变成0,把最右边的0变成1 二进制表示的非负数转换成十进制的时候首先 把每个数位单独代表的数字计算出来然后再 求和 0001 0011 = 2的4次方 + 2的1次方 + 2的0次方 = 16 + 2 + 1 = 19 0110 1010 = 2的6次方 +2的5次方 + 2的3次方 + 2的1次方 = 64 + 32 + 8 + 2 = 106 不断对原始数字进行除以2并保留整数部分的 操作可以得到一组数字,用这组数字中的 每一个除以2取余得到一个数位的内容。 把所有数位按照从后向前的顺序书写就 得到转换结果。 12 *******0 6 ******0 3 *****1 1 ****1 0 **** 转换结果是0000 1100 91 1 45 1 22 0 11 1 5 1 2 0 1 1 0 0 转换结果是0101 1011 负数的二进制和十进制之间不能直接转换, 必须借助相反数 转换过程需要首先计算相反数,然后把相反数 进行转换,最后根据转换结果再计算相反数 把二进制数字中每个数位的内容变成相反数然后 再加一就得到相反数的二进制 -14 14 0000 1110 1111 0001 + 1 = 1111 0010 有符号类型数字最左边的二进制数位内容可以 用来判断数字的符号,这个数位叫做符号位。 符号位内容是0表示数字是非负数,符号位 内容是1表示数字是负数。 1100 0101 0011 1010 + 1 = 0011 1011 59 -59