Mohican_11/27 C语言—类型
一. 基本数据类型:
整型 char short int long longlong
1 2 2/4 4 8
符号类型:
无符号类型:
整型变量的分类: 基本整型:int 短整型,short int长整型,long int
如果加上修饰符signed,则指定的是“有符号数”,如果既不指定为signed也不指定是unsigned,则隐含为有符号(signed)。
二.进制转换
1.十进制与二进制:与每一位比较,差值与下一位比 示例:125
128 64 32 16 8 4 2 1
(<) (<) (<) (<) (<) (<) > (<=)
125 61 29 13 5 1 空 1
二进制转换: 0 0 0 0 0 0 1 0
2.二进制与十进制转换: 按权展开,示例(10110.11)2=1*2^4+1*2^2+1*2^1+1*2^-1+1*2^-2=(22.75)10
3.二进制与八进制,十六进制的相互转换:
8 = 2^3 16 = 2^4
a.二进制与八进制的转换从小数点开始,分别向左,向右将二进制书按照每 3 为分组,不足的补0,然后写出每一组数等值的八进制数。
例如,求 (01101111010.1011)2的八进制:
二进制 001 101 111 010 . 101 100
八进制 2^0 2^2+2^0 2^2+2^1+2^0 2^1 2^2+2^0 2^2
1 5 7 2 . 5 4
b.二进制与十六进制的转换小数点开始,分别向左,向右将二进制书按照每 4 为分组,不足的补0,然后写出每一组数等值的十六进制数
例如,求(1101101011.101)2 的十六进制 :
二进制 0110 0110 1011 . 1010 (向右补0)
十六进制 2^2+2^1 2^2+2^1 2^3+2^1+2^0 . 2^3+2^1
6 6 B(11) . A(10)
TIP:十六进制数以0x开头,八进制数以0开头(所以一定要注意010不等于10),否则就是十进制。
三.原码 反码 补码之间的关系
编码:在数字系统中,信息和数据由二进制码来表示。用二进制数码按照一定规律排列起来表示给定信息的过程称为编码。代码的位数成为字长,它的数值成为真值。
带符号位置的编码可以用原码,反码,补码几种形式表示。
原码: 符号位 + 数值位 负数符号位取1 例: +62 -62
+62 原码 0011110 -62 原码 1011110
反码: 正数(原码与反码相同) 负数(符号为1,数值各位取反) 例 : +62 -62
+62 反码 0011110 -62 反码 1100001
补码: 字长为n的整数N的补码:
N 0<= N<2^n-1
[N]补 =
2^n+N -2^n-1 <=N<0
正数:正数和0的补码和原码相同
负数:负数的补码 讲原码的符号位保持不变,对数值位诸位求反,然后在最低为加1
TIP: (1)n位自唱的二进制原码,反码,补码所表示的十进制数位有数值范围:
原码: -(2^n-1 -1) ~ ~ +(2^n-1 -1)
反码: -(2^n-1 -1) ~ ~ + ( 2^n-1 -1)
补码 : -(2^n-1 ) ~ ~ +(2^n-1 -1) 不含 -0
(2)负数的补码: 取负数的绝对值,各位取反后,各位加一。
四. ASCII码取值范围0~127
1.无符号类型的去取值范围是 0~255
有符号类型的取值范围是 -128~127
交集就是 0~127 (提高代码的可移植性)
五.语句结构
#include<stdio.h>
int main
{
printf("hello,world")
return 0;
}
分解此程序
(1) #include
预编译 相当于 简单粗暴的复制代码
注意一点: #include < > 和 #include "" 的区别
<>先去系统目录中找头文件,如果没有在到当前目录下找。所以像标准的头文件 stdio.h、stdlib.h等用这个方法。
而" "首先在当前目录下寻找,如果找不到,再到系统目录中寻找。 这个用于include自定义的头文件,让系统优先使用当前目录中定义的。
(2)main函数 每个程序只能有一个main函数 ,对于main函数来说,可以不写返回值,但是如果对于其他函数来说,如果有返回值,一定要写return。
代码编译后要使用链接器进行链接,链接器需要知道代码从哪里开始执行。main函数就是这个约定好的用户代码默认入口。
一般来说,主函数应放在最后,其他被调用函数放在主函数前面。这样的话,其他被调用函数可以不予先声明。如果其他被调用函数放在了主函数后面,则在主函数之前一定要事先对被调用函数加以声明。
(3)printf
1
|
int printf ( const char *format, [argument]);
|
可以知道printf是整型函数,他的返回值也是整型
其值为printf实际控制输出的字符数。
printf函数实际上是将所有参数按字符输出,根据该函数的参数1(const char *format)。
(4)return
return 0首先是告知程序结束,很重要的一点是输出到标准错误流,表示程序执行正确。调试程序的时候可以编写 return 1或者其他不是0 的数字。表示程序执行出错。
六.变量
个人理解,相当于数学中的函数f(x)中的x。必须先定义。
变量:用来标识(identify)一块内存区域,这块区域的值一般是可以更改的,这就是它“变”的由来,但是我们可以通过使用如const等一些修饰符号来限定这一内存区域的操作特性(characteristic),即变量的操作特性。用const修饰的使变量不能更改的就和常量一样的变量叫做常变量。
(变量名的解释内容来自于:
链接:https://www.zhihu.com/question/34266997/answer/58226555
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。)
七.类型转换
隐式转换:编译时,由编译程序按照一定规则自动编译不需要人干涉,其中,C语言隐式转换规则如下:
1.如果一个操作数的类型是long double ,就把另一个操作数转换为long double 类型;
2.否则,如果一个操作数的类型是double,就把另一个操作数转换为double类型;
3.否则,如果一个操作数是float,就把另一个操作数转换为float类型;
4.否则,如果两个操作数的类型都是带符号的整数或无符号的整数,就把级别较低的操作数转换为另一个操作数的类型.
无符号整数类型的级别从低到高为:usigned char,shrot,int,long,long long
有符号整数类型的级别与对应的无符号整数类型级别一致;
5.否则,如果带符号整数类型的操作数级别低于无符号整数类型的级别,就把带符号整数类型的操作数转换为无符号整数类型;
6.否则,如果带符号整数类型的值域包含了无符号整数类型所表示的值,就把无符号整数类型转换为带符号整数类型;
7,否则,两个操作数都转换为带符号整数类型对应的无符号整数类型;
显示转换:强制类型转换.
TIP:
1.无论是强制转换或是自动转换,都只是为了本次运算的需要而对变量的数据长度进行的临时性转换,而不改变数据说明时对该变量定义的类型。
2.详细的转换表:http://blog.****.net/zhangzhi123456789/article/details/49589137
问题:
1.若两个数相加,int型,无符号, 那么计算 a+b时应该注意什么?
C语言本身,对于整数,不会发生溢出。这是语言本身的规定。
2.float在内存中的存储方式是什么?
float类型又称为单精度浮点类型,在IEEE 754-2008中是这样定义它的结构的:
S
EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF |
float类型总共4个字节——32位:
-
符号位
其中最左边的为符号位,0为正,1为负。 -
指数
接下来的E是指数,一共8位,也用二进制来表示。 -
尾数
最后的F是小数部分,尾数正是由这23位的小数部分+1位组成的。(这个稍后解释)。
虽然指数也是用8位二进制来表示的,但是IEEE在定义它的时候做了些手脚,使用了偏移来计算指数。
IEEE规定,在float类型中,用来计算指数的偏移量为127。也就是说,如果你的指数实际是0,那么在内存中存的就是0+127=127的二进制。
3.头文件大小写需要区分吗?
在windows操作系统下,头文件大小写不区分;
Linux操作系统下,需要区分。