1.常量
常量就是在程序运行中,不能改变的值。
1.1 整数常量
整数常量可以是十进制、八进制、十六进制的常量,前缀位0x代表十六进制,0代表八进制,不带前缀则表示十进制。
当我们想打印一个常量时候
%d是打印十进制的格式符
%o是打印八进制的格式符
%x是打印16进制的格式符
%c是打印单个字符的格式符
%s是打印字符串的格式符
%e是打印科学计数法的格式符
1.2 字符常量
在代码中用''单引号框起来的常量是字符常量,它存储在char类型的简单变量中。
当我们想输出一个常量时,如果用%d来输出字符常量,则会将字符常量对应的ASCLL码值输出。
a对应的是97,所以会将97输出
那么我们就可以用这个特性进行大小写转换,他们之间ASCLL码值差32,小写转大写就-32,大写转小写就+32
当你想输出字符串的时候,用%s,后面用双引号括起来否则会报错
字符串还有转义字符
/b的意思是退格,如果前面一个单位有字符,那么就覆盖它再输入后面的内容
/r 和 /n的区别 /r是回车,他的意思是回到当前行的起始位置,\n是换行的意思
/t是判定前面的位数,如果不够8位补齐8位,如果刚好8位则补一个8位的空格
\\ \' \" 其实就是再printf函数里将\ ' "打印出来
\ + 数字 会输出八进制数字
这里%d是输出一个整型的二进制转十进制的数字,最多只有8位,当超过8位时,高于8位的会被舍弃,最高位为符号位,下来的7位进行补码+1进行输出
// \ + x + 数字 会输出十六进制的数字
还有一种字符常量,可以在预处理阶段输入
#define + 常量名 + 值
这样就可以在代码中尽情使用这个固定值的量,就不用每次再输入这个数字
我们一般可以设置用处比较多的数,例如π,我们就可以再代码开头加上
#define PI 3.1415926
在后面需要这个进入运算时,直接写PI就好
2. 整数
整数就是没有小数部分的书,在C语言中,小数点永远不会出现在整数中
常用的整数类型的存储大小和值的范围:
unsigned 是一个无符号的整型数字
今天在输出无符号整型数字的时候出现了一个问题
我想强行输出一个带符号的无符号的数,就导致输出了一个特别大的数字
那为什么呢?
因为这里会输出32位的二进制数,-5为10...0101,取反+1就变成了11...0011,变成10进制就是一个非常大的数字
还有一个问题
这个代码输出的是-1,按理来说应该是最大的数字,但是,结果却不是这样的
这个超出了一个数字,所以,C语言编译的时候,将最大位变成符号位,剩下的位数取反+1,所以最后输出就是-1
遇到这个问题,就告诉我们,今后要输出的时候,一定要考虑这个数字可不可以输出,要不会出现不可预知的问题。
3.原码 反码 补码
上面的问题或多或少都提到了原码,反码,补码,那么三个东西是干啥的呢?
一句话其实就是解决负数运算的问题
不过具体的知识我也不知道,我在网上查到的资料,我觉得讲的不错,原文在这https://zhuanlan.zhihu.com/p/371184302
原码的表示与机器数真值表示的一样,即用第一位表示符号,其余位表示数值,例如的十进制的的正负1,用8位二进制的原码表示如下:
【+1】= 原:[ 0000 0001 ]
【-1】= 原:[ 1000 0001 ]
反码的表示方法为:
- 正数的反码是其原码本身。
- 负数的反码是在其原码的基础上,符号位不变,其余各位取反。
【+1】= 原: [ 0000 0001 ] = 反:[ 0000 0001 ]
【-1】 = 原:[ 1000 0001 ] = 反:[ 1111 1110 ]
补码的表示方法为:
- 正数的补码是其原码本身。
- 负数的补码是在其原码的基础上,符号位不变,其余各位取反后加1(即在反码的基础上加1)。
【+1】= 原: [ 0000 0001 ] = 反:[ 0000 0001 ] = 补:[ 0000 0001 ]
【-1】 = 原:[ 1000 0001 ] = 反:[ 1111 1110 ] = 补:[ 1111 1111 ]
计算机实际只存储补码, 所以原码转换为补码的过程,也可以理解为数据存储到计算机内存中的过程
在原、反、补码中,正数的表示是一模一样的,而负数的表示是不相同的,所以对于负数的补码来说,我们是不能直接用进制转换将其转换为十进制数值的,因为这样是得不到计算机真正存储的十进制数的,所以应该将其转换为原码后,再将转换得到的原码进行进制转换为十进制数。(机器数包含符号位)
4. 字符
字符我们可以用变量 = getchar()来接收,然后用putchar(变量)来输出
也可以用scanf("%c", &变量),然后用printf来输出
今天我做了一个练习
#include<stdio.h>
int main(){
printf("请输入你的班级:\n");
char a;
char b;
char c;
char d;
char e;
char f;
char g;
scanf("%c%c%c%c%c%c%c", &a, &b, &c, &d, &e, &f, &g);
printf("你的班级是:%c%c%c%c%c%c%c\n", a, b, c, d, e, f, g);
printf("请输入你的姓名:\n");
char h;
char i;
char j;
char k;
scanf("%c%c%c%c", &h, &i, &j, &k);
printf("你的姓名是:%c%c%c%c\n", h, i, j, k);
printf("请输入你的手机号:\n");
char l;
char m;
char n;
char o;
char p;
char q;
char r;
char s;
char t;
char u;
char v;
getchar();
l = getchar();
m = getchar();
n = getchar();
o = getchar();
p = getchar();
q = getchar();
r = getchar();
s = getchar();
t = getchar();
u = getchar();
v = getchar();
getchar();
printf("你的手机号是:%c%c%c%c%c%c%c%c%c%c%c", l, m, n, o, p, q, r, s, t, u, v);
return 0;
}
其实就是一段很简单的输入输出,但是我们还没学到数组,只能用一个变量一个变量来输入输出,我写代码的时候头皮发麻,不过这才开始,以后代码会越来越简单
5. 浮点数
下表列出了关于标准浮点类型的存储大小、值范围和精度的细节:
6. 运算符
今天除了自增和自减运算符都学到了,我们就可以用学到的知识来做一个练习:
求出输入数字的每一位上的数字:
#include<stdio.h>
int main(){
int a;
printf("请输入三位数字a:\n");
scanf("%d", &a);
printf("数字a的,个位是:%d, 十位数是:%d, 百位是:%d\n", a % 10, a / 10 % 10, a / 100);
int b;
printf("请输入四位数字b:\n");
scanf("%d", &b);
printf("数字b的,个位是:%d,十位是:%d, 百位是:%d, 千位是:%d\n",b % 10, b / 10 %10, b / 100 % 10, b / 1000);
int c;
printf("请输入五位数字c:\n");
scanf("%d", &c);
printf("数字c的,个位是:%d,十位是:%d, 百位是:%d, 千位是:%d , 万位是:%d", c % 10, c / 10 % 10, c / 100 % 10, c / 1000 % 10, c /10000);
return 0;
}
运行结果:
总结:
今天对计算机的运算规律有了进一步的认识,原来超出计算的位数,计算机就会“变傻”,将错误的答案输出,学到了原码反码补码的知识就很好解释这些问题,C语言还有很多知识点,慢慢来吧。