
#include <stdio.h>
int main(void)
{
printf("hello world\n");
return 0;
}
初识
C语言都要有个头文件,目前这个头文件是输入输出函数的头文件,这个头文件里已经将输入输出的函数设置好了,你现在之所以能简单的printf出你要的字符串,这都是 <stido.h> 头文件为你设置好了的,所以你不要天真的认为你随便一个printf就能输出字符串。要不你注释掉 #include<stdio.h>试试。
而 main()函数称为 主函数,不管到哪必须有一个,因为只有它能告诉电脑,我这些代码要做什么。
而 int main(void) 的这个int 是整数,是要告诉电脑,里面这些代码运行完后,用什么类型返回,或是用什么类型结束。(注意,是类型,int类型,是整形,void是空类型,就是没有返回。你也可以float ,double等等,是要是数据类型。都可以给main()函数定义类型。)
这个int main()里的int 对应的是 最后面的 return 0; 0是整数,也是空 ,是结束。如果是void的main()函数。就可以不用 return了。也就没有返回了。
变量名是什么
二进制。C语言输入的东西存入计算机里,都是以二进制存入。计算机只认识二进制。010101这种。
比如存入 int a=1,在计算机里它就是 0000 0000 0000 0000 0000 0000 0000 0001 因为int 是4字节,1个字节是8位,所以是4*8=32位。
而a是 0000 0000 0000 0000 0000 0000 0000 0001的变量名,变量名里的值是会变换的,比如int a+=a,在放入循环内,他的值就会一直变,内存里的二进制也就跟着一直变。
如果没有变量名会怎样?你总不会拿着 这么大一串二进制数字去打代码把,所以就有了变量名。一个变量名就能告诉计算机这是做什么的,方便提取,方便记忆,方便使用。
数据类型
数据类型有很多种,我们就列出常用的几种,int , float , double ,char。数据类型很多人认为是存储的意思,但我告诉你,不是。它更像传达者。数据类型是官方已经定好的内存空间。我们要输入的数据存入内存里面怎么存?
计算机会将我们存入的东西转换为二进制存入。而要存在哪里,很模糊,计算机也很懵逼,你丢了个什么东西在我内存里?
所以就有了数据类型这几个东西。你给一个变量名a定义一个int,计算机就会在内存里面开辟一个4个字节的内存空间。你用double。计算机内存就会为你开辟一个8个字节的内存空间。int和double这种类型又不一样。就像double,它又会再开辟好的内存空间组成双精度用的指数位和尾数位还有符号位。(这里有个很有趣的游戏,我在文章底下会给你测试一下这个游戏。就跟数据类型有关。)
int 是整型,4个字节,就我们平常用的10进制数字,不带小数点的数字。它可以存到多少数值,你们去弄个进制转换工具,输入32个1,转换为10进制,就知道他的数值范围可以多少。
float是实型(浮点型,单精度),4个字节,但它和整数的4个字节不一样,它带有小数点,而int整型用一除以二,得出的值是0,为什么?因为他无法带小数点,在内存里的话有冲突,他只能舍弃小数后面的数,为什么不四舍五入?你让二进制01010101怎么四舍五入?所以int计算出来不是实数,是整数。
doubel和float一样,也是实数(浮点型,但他是双精度,单双精度后面会说),但它牛逼了,它有8个字节。牛逼的不是他有64位,而是它的内存位的指数更长,尾数更长。所以不是字节更长的意思。相比float,double数值更准确更精度一点。
char是字符 1个字节 这个我们最常用。老外的英文字母就用的ascll买转换成十进制在转换二进制。但只能单个字符。很多人说char也是字符串数据类型,但我告诉你这句话是错的。因为C语言根本就没有字符串这个数据类型,只有字符数据类型。怎么变成字符串呢,那就要用到类似于数组的存放了,一整串的字母组成的英文句子,每个字母都是一个ascll值,而存在内存的每个字母其实都是分开的。只不过它像数组一样有序的合并在一起,数组后面会说。我们的汉字呢,也一样,只不过是用另一个方法转换为二进制。都知道计算机只识别二进制,那汉字怎么转为二进制?这就和unicode和GB2312有关了。汉字经过unicode表或GB2312表转换为二进制。
浮点型的单精度和双精度
首先,我们先列个图示例一下。float 在内存里是:
() () () () () () () () | () () () () () () () () | () () () () () () () () | () () () () () () () ()
每8位一个字节。4个字节是32位。
(1) (2) (2) (2) (2) (2) (2) (2) | (2) () () () () () () () | () () () () () () () () | () () () () () () () ()
其中第一位,也叫最高位是符号位 里面是0就是正整数,是1就是负数。而里面有2的位置都是指数,指数有8位。而括号没有内容的,就是尾数,尾数有23位。
而我们拿个数字解释一下,3.45这个浮点数是在怎么在内存体现的呢?
3.45里的3转为2进制是0011,0.45则是乘以2,直到出现小数点左边的数值出来。
0.45x2=0.9 =0 取0 0.9继续算
0.9x2=1.8; =1 取1 0.8继续算
0.8x2=1.6; =1 取1 0.6继续算
0.6x2=1.2; =1 取1 0.2继续算
0.2x2=0.4; =0 取0 0.4继续算
0.4x2=0.8; =0 取0 0.8继续算
0.8x2=1.6; =1 取1 0.6继续算
.......这个算不完了,因为要算到值等于1,要算很久。但我们只要23位,因为得出的这个数值,是用来做尾数位的,我们只保留23位位数为,就是01110011001100110011001。
最后得出3.45=0011+01110011001100110011001=11.01110011001100110011001;
然后科学计数法 11.01110011001100110011001=1.101110011001100110011001x21;
再看看指数,就是括号有2的那几个,总共有8位。8位二进制1换算成十进制是255。但我们只要255的中间数,所以是255/2=127.5,舍小数位是127。用127+刚才小数点得出的1=127+1=128;
128转2进制就是128=10000000;这8位就是指数位了。
(0) (1) (0) (0) (0) (0) (0) (0) | (0) () () () () () () () | () () () () () () () () | () () () () () () () ()
然后把0.45科学计数法后的位数,得出1.10111001100110011001100这23个二进制,得出
(0) (1) (0) (0) (0) (0) (0) (0) | (0) (1) (0) (1) (1) (1) (0) (0) | (1) (1) (0) (0) (1) (1) (0) (0) | (1) (1) (0) (0) (1) (1) (0) (0)
我们来计算一下他的内存存储段位数是多少:
左边起第一段01000000 符号位是0,是正整数64;
第二段01011100 符号位是0 是正整数92;
第三段是11001100 符号位是1 是负数,所以要反码,符号位不变10110011 在补码+1=10110100 =-52;
第四段(也叫地位段)是11001100 符号位是1 是负数,所以要反码,符号位不变10110011 在补码+1=10110100 =-52;(但计算机为什么是-51,有待了解,似乎是我们刚才只保留了23位,所以我们只算了前23位,他后面的位数又继续算了下去,根据反码补码形式形成数差。因为补码+1,所以有差。)
doubele 这个双精度为什么更精度呢。这就要说他在内存的位置比float多的同时,它的符号位还是1位,但他的指数位有11位,这已经能让你的小数点值更精确了,而后的尾数位有52位。他的尾数位更长了……
而它的浮点数值在内存的存法和float一样,只不过它的指数位是11位,11个2进制数值是2047,除以2是1023.它的指数位不在是127去加,而是1023去加了。这个你们可以慢慢算。
加深了解
以下适合什么样的数据类型?
a:你所在的省份有多少人口? 答:用int整数类型,你不可能有0.5的人口吧,半个人,有点吓人!!!!
b:超市的产品价格用什么类型? 答:用flaot单精度浮点类型,价格不可能都是整数,1.5元,9.9元等,都是浮点
c:写一个产品的品名/名称用什么类型? 答:char字符类型,比如苹果,蔬菜,笔记本都是字符串。
d:测量湖底深度用什么类型? 答:float或double,如果需要更精度的数值,可以用double;
以下几个都是什么数据类型?
a: 'a'; 答:属于 char类型,字符类型
b: 2023; 答:int 整数类型
c: 3.1415; 答:float 浮点类型
d: 1b3D; 答:char 字符串类型
出个题