day3
变量
变量的命名规则
- 由数字、字母和下划线构成
- 不能以数字开头
- 严格区分大小写
- 不能和C语言的32个关键字重复
变量的声明
int a;
printf("%d\n",a); // 随机数
int n1 = 10;
printf("%d\n",n1); // 10
a = 100;
printf("%d\n",a); // 100
n1 = a;
printf("%d\n",n1); // 100
int n2 = n1;
printf("%d\n",n2); // 100
类型转换
uint a = 0xFFFFFFFF;
ushort b = a;
printf("a=%#x,b=%#x\n", a, b); // a=0xffffffff,b=0xffff
ushort c = 0xFFFF;
uint d = c;
printf("c=%#x,d=%#x\n", c, d); // c=0xffff,d=0xffff
float e = 1.111;
int f = (int)e;
printf("e=%f,f=%d\n", e, f); // e=1.111000,f=1
unsigned int c = 2; //无符号数
signed int a = -3; //有符号数
printf("%u\n",a+c); //隐式的强制类型转换,无符号数和有符号数一起运算,强转成无符号数
原码、反码和补码
计算机中,数据都是以补码的形式进行存储和运算。
TIP:原码、反码和补码都是二进制表示的
- 原码:人能看懂的,十进制转换过来的
- 反码:原码和补码的一个中间状态 ,正数原码、反码和补码都一样,负数,原码的除符号位外其他位取反
- 补码:计算机中存储和运算用的都是补码,正数原码、反码和补码都一样,负数的补码是反码+1
- 正数的原反补都相同
- 负数的反码是原码除符号位外取反,补码是反码+1
变量越界
char a = 213;
char b = a;
printf("%d", b);
int i = g + h;
uint j = g + h;
printf("i:%d,j:%#x\n", i, j); // i:-1,j:0xffffffff
输入输出
printf
int printf(const char *format, ...);
// printf("占位符/格式符",输出表象);
printf("%d\n", 10); // 10
转义字符
字符 | 含义 | 说明 |
---|---|---|
\n | 换行 | ASCII:10 |
\t | 制表符 | 一个tab键的大小4个空格 |
\b | 退格 | 回退一个字符 |
\r | 回车 | 回退到行首进行输出 |
\\ | 反斜杠 | 输出一个\ |
格式符
格式符 | 说明 |
---|---|
%d | 整形数据的格式符 |
%-nd | 以n 个数据宽度左对齐输出,不够就补空格 |
%nd | 以n 个数据宽度右对齐输出,不够就补空格 |
%ld | 长整型数据的格式符 |
%f | 浮点型的格式符,printf 默认输出小数点后6位 |
%.mf | 指定小数点后的输出位数 |
%lf | 双精度浮点型的格式符 |
%c | 字符型的格式符 |
%s | 字符串的格式符 |
%#x | 输出十六进制,并且带前导符0x ,小写x ,输出十六进制时都是小写的 |
%#X | 输出十六进制,并且带前导符0X ,大写X ,输出十六进制时都是大写的 |
%% | 输出一个% |
%u | 无符号数输出的格式符 |
scanf
垃圾字符回收
int scanf(const char *format, ...);
// scanf("格式符",变量的地址);
// &:取地址符,取变量的地址
char *a = malloc(1);
char *b = malloc(1);
// 1. 严格控制
scanf("%c,%c", a, b);
printf("a=%c,b=%c\n", *a, *b);
// 2. 分开获取
scanf(" %c", a);
scanf(" %c", b);
printf("a=%c,b=%c\n", *a, *b);
// 3. 获取字符函数:getchar()
getchar();
scanf("%c", a);
getchar();
scanf("%c", b);
printf("a=%c,b=%c\n", *a, *b);
// 4. 舍弃:%*c
scanf("%*c%c%*c%c", a, b);
printf("a=%c,b=%c\n", *a, *b);
题目
-
整理思维导图
-
有以下变量求输出结果,并写出数据存储和取出的过程
signed char c = 178;
printf("%d\n",c);
printf("%u\n",c);
unsigned char d = -9;
printf("%d\n",d);
printf("%u\n",d);
#include <stdio.h>
int main() {
signed char c = 178;
// c变量存储:
// 源码=1011 0010
// 反码=1011 0010
// 补码=1011 0010
// 取出来,准备进函数:
// 补码=1011 0010
// 反码=1011 0001
// 源码=1100 1110
// 放进printf
printf("%d\n", c);
// 函数中,局部变量存储:
// 源码=1000 0000 0000 0000 0000 0000 0100 1110
// 反码=1111 1111 1111 1111 1111 1111 1011 0001
// 补码=1111 1111 1111 1111 1111 1111 1011 0010
// 函数中取:
// 补码=1111 1111 1111 1111 1111 1111 1011 0010
// 反码=1111 1111 1111 1111 1111 1111 1011 0001
// 源码=1000 0000 0000 0000 0000 0000 0100 1110
// 输出:-78
printf("%u\n", c);
// 函数中,局部变量存储:
// 源码=1000 0000 0000 0000 0000 0000 0100 1110
// 反码=1111 1111 1111 1111 1111 1111 1011 0001
// 补码=1111 1111 1111 1111 1111 1111 1011 0010
// 函数中取:
// 无符号时 c源码 = c补码 = 4,294,967,218
unsigned char d = -9;
// c变量存储:
// 源码=1000 1001
// 反码=1111 0110
// 补码=1111 0111
// 取出来,准备进函数:
// d无符号: 源码 = 补码 = 1111 0111
// 放进printf
printf("%d\n", d);
// 函数中,局部变量存储:
// 补码 = 源码 = 0000 0000 0000 0000 0000 0000 1111 0111
// 函数中取:
// 源码 = 补码 = 0000 0000 0000 0000 0000 0000 1111 0111
// 输出:247
printf("%u\n", d);
// 函数中,局部变量存储:
// 补码 = 源码 = 0000 0000 0000 0000 0000 0000 1111 0111
// 函数中取:
// 源码 = 补码 = 0000 0000 0000 0000 0000 0000 1111 0111
// 输出:247
}
- 求-57的原码、反码和补码
原码:10111001
反码:1100 0110
补码:1100 0111