03-数据类型、sizeof 运算符、标识符、scanf 输入
1. 数据类型sizeof 运算符目标会查看变量、类型占用内存大小 每种数据类型都有自己固定的占用内存大小和取值范围。语法 1sizeof(变量名)inta10;printf(%llu\n,sizeof(a));//sizeof(a) 获取 a 变量占用内存大小。可以用 printf 显示出来// 查看 sizeof 返回的占用内存大小需要使用 %llu 格式符语法 2sizeof(类型名)printf(%llu\n,sizeof(double));// 也可以使用 sizeof 直接查看某种类型占用的内存大小数值型整型目标选用不同类型存整数基础信息数据类型字节数格式符数据范围最小值宏最大值宏short短整型2%hd-215~ 215-1 (-32768 ~ 32767)SHRT_MINSHRT_MAXint整型4%d-231~ 231-1 (-2147483648 ~ 2147483647)INT_MININT_MAXlong长整型4%ld-231~ 231-1 (-2147483648 ~ 2147483647)LONG_MINLONG_MAXlong long长长整型8%lld-263~ 263-1LLONG_MINLLONG_MAXunsigned short无符号 短整型同 short%hu0 ~ 216-1 (0 ~ 65535)0USHRT_MAXunsigned int无符号 整型同 int%u0 ~ 232-1 (0 ~ 4294967295)0UINT_MAXunsigned long无符号 长整型同 long%lu0 ~ 232-1 (0 ~ 4294967295)0ULONG_MAXunsigned long long无符号 长长整型同 long long%llu0 ~ 264-10ULLONG_MAX上表中列出的占用字节数和取值范围是大多数情况下各种类型的取值。 由于C标准没有具体规定以上各类数据所占用的字节数。因此在不同系统、编译器下数据类型占用的字节数会有所不同。比如int 类型在 Turbo C 环境占 2 字节取值范围与 short 相同。 而在 Visual C 环境下是 4 字节。再如long 类型相同的 gcc 编译器下在 Windows 系统中占 4 字节而在 Linux 系统中占 8 字节。可以使用 sizeof 查看 数据类型 占用内存的大小。可以引入头文件#include limits.h借助宏来查看 数据类型 在当前平台上 对应的最小、最大值。#includestdio.h#includelimits.hintmain(void){printf(short 大小 %llu\n,sizeof(short));printf(short 最小值 %hd 最大值 %hd\n,SHRT_MIN,SHRT_MAX);printf(unsigned short 最小值 0 最大值 %hu\n,USHRT_MAX);printf(\n);printf(int 大小 %llu\n,sizeof(int));printf(int 最小值 %d最大值 %d\n,INT_MIN,INT_MAX);printf(unsigned int 最小值 0, 最大值 %u\n,UINT_MAX);printf(\n);printf(long 大小 %llu\n,sizeof(long));printf(long 最小值 %ld 最大值 %ld\n,LONG_MIN,LONG_MAX);printf(unsigned long 最小值 0 最大值 %lu\n,ULONG_MAX);printf(\n);printf(long long 大小 %llu\n,sizeof(longlong));printf(long long 最小值 %lld 最大值 %lld\n,LLONG_MIN,LLONG_MAX);printf(unsigned long long 最小值 0, 最大值 %llu\n,ULLONG_MAX);printf(\n);return0;}有符号数和无符号数有符号 可以表示正数和负数 无符号 只能表示正数 signed char num; 有符号数num unsigned charnum;无符号数num有符号 最高位为符号位其他位数据位 无符号全都为数据位数的范围有符号数和无符号数能够表示数的个数相同只是表示数的范围不一样char 有符号数和无符号数能够表示数的个数相同只是表示数的范围不一样signedchar10000000-11111111-0--12700000000-011111110-127规定 将-0表示成-128-128-127(-2^7-2^7-1)unsignedchar00000000-111111110-255(0-2^8-1)shortsignedshort(-2^15-2^15-1)unsignedshort(0-2^16-1)intsignedint(-2^31-2^31-1)unsignedint(0-2^32-1)bool型目标知道 bool 类型两种取值 C语言在设计之初是没有布尔类型的使用 1 和 0对应表示真、假。 但其他编程语言像 C、java 都设计有布尔数类型。 C语言在1999 年推出的新标准C99中也加入了 布尔类型。用 true 来代表 1为真用 false 来代表 0为假。使用时需要引入头文件#include stdbool.h#includestdbool.hintmain(void){printf(%d, %d\n,true,false);// 1, 0return0;} 虽然语法上与其他语言一致但 C 语言每次在使用时需先引入头文件较为麻烦。 因此一些老 C 工程师还是喜欢直接在程序中用 1 和 0 来表示 真和假。实型目标会选用浮点型变量存小数 实型表示有符号的十进制小数在计算机内部以浮点方式表示小数点是浮动的因此也叫浮点型。 常见实型有两种float (单精度)、 double (双精度)基础信息类型字节数格式符有效数字常量后缀float (单精度)4%f6~7fdouble (双精度)8%lf15~16无我们直接书写的小数常量如 6.23系统默认看做 double 类型。如想指明为 float 类型需加后缀 f6.23f。6~7整数部分 小数部分 6 位 准确。整数部分 小数部分 7 位可能准确也可能不准确。整数部分 小数部分 7位。大多不准确。15~16整数部分 小数部分 15 位 准确。整数部分 小数部分 16 位可能准确也可能不准确整数部分 小数部分 16位。大多不准确。显示小数时%f 和 %lf 默认保留 6 位小数。 如需指定小数位数使用格式符%.nfn 为几表示精确到小数点后几位会对 n1 位做 4 舍 5 入。#includestdio.hintmain(void){floatf1.23456789101112131415f;// 定义有 20 位小数的 float 变量doubled1.23456789101112131415;// 定义有 20 位小数的 double 变量printf(f%.20f\n,f);printf(d%.20lf\n,d);return0;}字符型目标会在程序中使用字符型数据基础信息 C 语言定义 char 类型来表示字符数据。 其本质依然是存储数值因此与数值型类似也有有符号、无符号之分。占用 1 个字节内存大小。类型字节数格式符数据范围最小值宏最大值宏char1%hhd-27~ 27-1 (-128 ~ 127)CHAR_MINCHAR_MAXunsigned char1%hhu0~28-1 (0 ~ 255)0UCHAR_MAXASCII 码char类型在程序中最常用来表示字符。其本质依然是一个数字但每个值都对应一个固定的字符共定义了128个字符。c称之为 ASCII 码 (American Standard Code for Information Interchange) 美国信息交换标准代码。ASCII值控制字符ASCII值字符ASCII值字符ASCII值字符0NUL32(space)6496、1SOH33!65A97a2STX3466B98b3ETX35#67C99c4EOT36$68D100d5ENQ37%69E101e6ACK3870F102f7BEL39‘71G103g8BS40(72H104h9HT41)73I105i10LF42*74J106j11VT4375K107k12FF44,76L108l13CR45-77M109m14SO46.78N110n15SI47/79O111o16DLE48080P112p17DCI49181Q113q18DC250282R114r19DC351383S115s20DC452484T116t21NAK53585U117u22SYN54686V118v23TB55787W119w24CAN56888X120x25EM57989Y121y26SUB58:90Z122z27ESC59;91[123{28FS6092\124|29GS6193]125}30RS6294^126~31US63?95_127DEL 上表中有 6 个字符对应的 ASCII 较为常见建议大家记下会为后续写代码提供很多方便。字符ASCII 码字符ASCII 码空0‘\n’10空格32048A65a97 需注意的是我们从键盘键入的所有内容都是字符。如键入数字 7实际是字符 ‘7’真正存储在计算机内的是 55字符 7 的 ASCII 码值而如果我们键入了 35实际上这是两个字符。真正存储在计算机内的是 51 和 53字符 3 和 字符 5 的 ASCII 码值。 我们可以用 printf 结合 格式符 %c显示字符。 如果用 %d就显示 其 ASCII 值了。#includestdio.hintmain(void){charch53;printf(ASCII为%d, 字符为%c\n,ch,ch);return0;}转义字符C 语言提供了一类特殊的字符是由 \ 和特定字符组合而成称之为 转义字符。他们都是一个字符如‘\n’ 这是 1 个字符。 代表 回车换行回车键。‘\t’ 也是 1 个字符。代表 制表符 Tab键。‘\b’ 同样是 1 个字符。 代表 退格符Backspace 键。‘\0’ 是一个字符。代表 空。对应 ASCII 值 0。‘\ddd’ 是一个字符。ddd 对应 3 个八进制数没有用 0 开头。 如\141 对应 ASCII 值为 97代表 ‘a’。‘\xhh’ 是一个字符。x 表十六进制hh 对应 2 个十六进制数。 如\x41 对应 ASCII 值为 65代表 ‘A’。\ 还可以在特定环境下将一个字符还原其本身意。比如现在想在 printf(“%d\n”10)输出 10 的时候用 “” 把 10 包裹住。 如果直接写 printf(“ “%d” \n”10)是会报错的。这时可以使用\将 “ 进行转义还原其本身意。printf(\%d\,10);// 这里的 \ 看做一个双引号字符。类似的还有\代表 单引号。\\代表 反斜杠。字符输入输出C 语言提供了专门的函数方便在程序中 获取、输出 字符数据。getchar()获取用户从键盘写入的一个字符。程序执行到 getchar() 会暂停等待用户键入字符数据。一次 getchar() 调用只读取一个字符。如用户键入多个字符需要多次调用 getchar()读取。函数调用完成会返回实际读到的字符 对应的 ASCII 值。用户键入字符结束敲的回车键对应‘\n’ 字符也可以使用 getchar() 读取。intretgetchar();putchar(ch)将 ch 对应的字符输出到屏幕。ch 可以是变量也可以是常量。一次 putchar() 调用只写出一个字符不含换行符 ‘\n’。函数调用完成会返回实际写出的字符 对应的 ASCII 值。charchA;intretputchar(ch);2. 标识符2.1 什么是标识符 程序中我们自己起的名字统称为标识符2.2 标识符的硬性要求以数字、字母、下划线组成不能以数字开头不能是关键字区分大小写2.3 标识符的软性建议 用英文单词见名知意 变量名全部小写 文件名全部小写单词之间用下划线隔开3. scanf 输入目标接收用户输入数据 我们可以借助 getchar() 读取用键入的字符数据。 如果想要读取其他数据怎么办呢C语言提供了 scanf() 函数可以结合 格式符 读取各种类型数据。基础信息作用从标准输入设备键盘上按格式获取数据。语法scanf(格式控制字符串“, …); 需指定头文件#include stdio.h参 1 必须是字符串且必须包含 格式说明符占位符格式符 与 数据类型中使用方式一致。 常用的有 %d、%c、%f、%lf 等。后续参数变参个数直接受 参 1 格式匹配符影响。对应 格式符的 必须是 变量地址变量名可取变量地址代表数据存放位置。示例printf(“请输入一个字符”);// 借助 printf 提示用户输入charch0;// 准备变量存储数据scanf(%c,ch);// 使用变量地址与 格式符对应printf(“请输入三个整数用逗号间隔”);inta,b,c;// 可以不赋初值。scanf(%d,%d,%d,a,b,c);注意事项不要在 scanf 的参 1 中添加类似 printf() 的提示字符串和 \n 换行符。键入数据时数据个数、类型、顺序必须与参 1 中占位符一一对应。键入数据时数据间的分割符必须与 参 1 中 占位符的分割符一致。scanf 的返回值代表格式符成功匹配数据的次数。较少使用VS2019 以后的版本编译时会将 scanf 划为 “不安全函数”爆出C4996 错误推荐你使用 s_scanf() 函数。但学习、练习、测试时直接使用 scanf 很方便可暂时屏蔽该错误。方法 1在项目中设置工程名→右键→属性→C/C→预处理器→预处理器定义→编辑→将 _CRT_SECURE_NO_WARNINGS 加入“预处理定义” 中方法 2在每个.c文件开头第一行添加宏#define _CRT_SECURE_NO_WARNINGS4.原码数的最原始的二进制码12001111000-2310010111-0 1000 00000 0000 0000-1 1000 00011 0000 00011 -10000 0001 1000 0001 1000 0010 -2注意 负数如果在计算机中用原码存会导致两个问题 负数运算结果不正确0的状态还有两种5.反码正数的反码不变 负数的反码符号位不变其他位取反-01111 111100000 0000-11111 111010000 00011 -1 1111 1111 -0如果计算机用反码去存负数运算结果正确但是 0的状态还是有两种6.补码正数的补码不变负数的补码等于反码加1-00000 000000000 0000-11111 11111 0000 00011 -1 0如果计算机用补码去存负数运算结果是正确的0的状态只有一种补码求原码-23原码 10010111反码 11101000补码 11101001反码 10010110补码求原码 符号位不变其他位取反原码 10010111反码求原码 反码加1#define_CRT_SECURE_NO_WARNINGS#includestdio.h#includestring.h#includestdlib.hintmain(){//赋值时输入赋的是十进制给的是原码。如果赋值给的是八进制或者十六进制给的是补码//打印时输出十进制打印要的是原码如果是十六进制或八进制打印要的数补码charnum129;//129的原码反码补码 1000 0001//但是num是有符号数最高位为1计算机认为这是一个负数的补码// 补码如何求原码//补码 1000 0001//反码1111 1110//原码 1111 1111printf(num%d\n,num);//-127system(pause);return0;}7.进制的书写和打印数在计算机存的内容没有改变打印时只是输出的形式改变而已#define_CRT_SECURE_NO_WARNINGS#includestdio.h#includestring.h#includestdlib.hintmain(){intb056;//printf(a%o\n,b);//%o以八进制数形式输出整数printf(a%X\n,b);//x以十六进制数形式输出整数printf(a%d\n,b);system(pause);return0;}intmain02(){inta123;intb056;intc0xab;printf(a%d\n,a);printf(a%o\n,b);//%o以八进制数形式输出整数printf(a%X\n,c);//x以十六进制数形式输出整数printf(a%#X\n,c);//无符号整数以十六进制形式输出同时添加0X前缀system(pause);return0;}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2558927.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!