C | C语言学习(二)占位符、常量、scanf()、进制变换
1.打印占位符:
| 占位符 | 说明 |
| %d | 输出一个有符号的10进制int型(signed int) |
| %f | 输出一个float型(默认保留六位小数)(float) |
| %.2f | 输出一个float型,保留两位小数 (C语言中存在四舍五入,C++不存在) |
| %lf | 输出一个double型(double) |
| %u | 输出一个无符号的10进制int型(unsigned int) |
| %hd | 输出一个short int型 |
| %ld | 输出一个long int型 |
| %ud | 输出一个long long int型 |
| %c | 输出一个char型 |
| %s | 输出字符串,遇到\0停止(char *) |
| %p | 输出16进制形式的内存地址 |
| %e | 以科学计数法形式输出 |
| %o(字母o) | 输出无符号8进制的int类型(unsigned int) |
| %x(%X) | 输出16进制的int类型,字母以小写输出(字母以大写输出)(unsigned int) |
| %hu | 输出unsigned short类型 |
| %lu | 输出 unsigned long类型 |
| %llu | 输出 unsigned long long类型 |
printf 附加格式:
| 字符 | 含义 | 举例 |
| - | 左对齐 | int a=10 ; //输出结果:10___ |
| m(m是一个整数) | 数据最小宽度 | int a=10 ; //输出结果:___10 |
| 0(数字0) | 与m搭配使用,不可和-搭配使用,将输出的数前面加上0,直到数据宽度为m | int a=10 ; //输出结果:00010 |
| m.n(m与n都是一个整数) | m指域宽,即对应的输出项在输出设备上所占的字符数。 n 指精度,用于说明输出的实型数的小数位数。 对数值型的来说,未指定 n 时,隐含的精度为 n = 6 位。 | float b = 3.1415f; //输出结果:3.14 |
2.定义常量的两种方式:
a.#define 名称 值
b.const 数据类型 名称=值;
注意:方法a结尾没有分号;方法b在C语言中不安全。
#define PI 3.14
const float PI = 3.14;
3.VS中直接使用scanf()等函数会提示不安全,运行下方代码,会报错: C4996 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS.
解决办法(三种):
a.代码中添加#define _CRT_SECURE_NO_WARNINGS(这个宏定义最好放到c文件的第一行)
b.代码中添加 #pragma warning(disable:4996)
c.采用带_s的函数,如scanf_s,但这并不是标准的C函数。
printf("请输入一个整数:");
int a = 0;
scanf("%d",&a);
printf("%d\n",a);
4.进制变换:
| 进制变换 | 方法 | 举例 |
| 十进制->二进制 | 除二反序取余法 | 123(十进制): 123/2=61……1 61/2=30……1 30/2=15……0 15/2=7……1 7/2=3……1 3/2=1……1 1/2=0……1 1111011(二进制) |
| 拆分为2的指数 | 123(十进制):123=64+32+16+8+2+1=2^6+2^5+2^4+2^3+2^1+2^0=1111011(二进制) | |
| 十进制->八进制 | 除八反序取余法 | 123(十进制): 123/8=15……3 15/8=1……7 1/8=0……1 173(八进制) |
| 十进制->十六进制 | 除16反序取余法 | 123/16=7……11 7/16=0……7 7B(十六进制) |
| 二进制->十进制 | 权值法 | 1111011(二进制): 1*2^0+1*2^1+0*2^2+1*2^3+1*2^4+1*2^5+1*2^6=123(十进制) |
| 8421法则 | ……64 32 16 8 4 2 1 1 1 1 1 0 1 1(二进制) 64+32+16+8+2+1=123(十进制) | |
| 二进制->八进制 | 从右向左每3个一组转为八进制 | 1 111 011(二进制) 1 7 3(八进制) |
| 二进制->十六进制 | 从右向左每4个一组转为八进制 | 111 1011(二进制) 7 B(十六进制) |
| 八进制->十进制 | 权值法 | 173(八进制):3*8^0+7*8^1+1*8^2=3+56+64=123(十进制) |
| 八进制->二进制 | 每一位转为3位的二进制 | 1 7 3(八进制) 001 111 011(二进制) |
| 十六进制->十进制 | 权值法 | 7B(十六进制) 11*16^0+7*16^1=11+112=123(十进制) |
| 十六进制->二进制 | 每一位转为4位的二进制 | 7 B(十六进制) 0111 1011(二进制) |
| 小数十进制->二进制 | 小数位乘二正向取整法 | 0.456(十进制) 0.456*2=0.912……0 0.912*2=1.824……1 0.824*2=1.648……1 0.011(二进制) |
5.数据类型的作用:编译器预算对象(变量)分配的内存空间大小。
6.在定义数据时,可以直接定义十进制、八进制(以0开头)、十六进制(以0x开头),但不可以直接定义二进制。
7.sizeof:
a. sizeof不是函数,所以不需要包含任何头文件,它的功能是计算一个数据类型的大小,单位为字节。
b. sizeof的返回值为 size _ t。
c. size _ t 类型在 32 位操作系统下是 unsigned int,是一个无符号的整数。
d. 使用:sizeof(数据类型)或者sizeof(变量名)。
8.浮点型float、double:不以 f 结尾的常量是 double 类型,以 f 结尾的常量 ( 如 3 . 14f ) 是 float 类型。
9.原码、反码、补码:
原码:最高位做为符号位 , 0 表示正 , 为 1 表示负;
反码:对于正数 , 反码与原码相同;对于负数 , 符号位不变 , 其它部分取反;
补码:对于正数 , 原码、反码、补码相同;对于负数 , 其补码为它的反码加 1。
补码推原码:符号位不动,其他位取反,最后整个数加1,得到原码。
10.在计算机系统中,数值一律用补码来存储,主要原因是:
a.统一了零的编码;
b.将符号位和其它位统一处理;
c.将减法运算转变为加法运算;
d.两个用补码表示的数相加时,如果最高位 ( 符号位 ) 有进位,则进位被舍弃。