Mohican_11/27 C语言—类型

来源:互联网 发布:unity3d 美女 模型 编辑:程序博客网 时间:2024/06/04 20:13

一.   基本数据类型:

整型             char     short       int       long       longlong

                      1           2          2/4         4             8

符号类型:

无符号类型:

整型变量的分类: 基本整型:int 短整型,short int长整型,long int

对以上三类加上修饰符unsigned以指定是“无符号数”。

如果加上修饰符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

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修饰的使变量不能更改的就和常量一样的变量叫做常变量。

变量名:是一个标识符(identifier),用来指代一块内存区域,即变量,使用变量使我们操作内存以区域(area),以块(block)为单位,提高了方便性。

(变量名的解释内容来自于:
作者:Jason Ji
链接: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.csdn.net/zhangzhi123456789/article/details/49589137

问题:

1.若两个数相加,int型,无符号, 那么计算 a+b时应该注意什么?

unsigned int a=1,int b=-2;
int c=-2;
cout<<b<<endl;
if(a+c>0)
cout<<a+b<<endl;
运行结果:
4294967294
4294967295
Press any key to continue
首先,程序的第一行,变量b和a一样,都是无符号整型,这是一个陷阱。
其次,在32位系统中,int的范围是-2147483648~+2147483647,而unsigned int的范围是0~4294967295。负数在无符号整型中用补码表示,所以b是4294967294。
第三,int默认为signed int,它与unsigned int运算时,结果被转换为unsigned int,所以a是4294967295。

C语言本身,对于整数,不会发生溢出。这是语言本身的规定。


2.float在内存中的存储方式是什么?


float类型又称为单精度浮点类型,在IEEE 754-2008中是这样定义它的结构的:


  S     EEEEEEEE      FFFFFFFFFFFFFFFFFFFFFFF
 31   30        23    22                               0

 

float类型总共4个字节——32位:

  1. 符号位
    其中最左边的为符号位,0为正,1为负。
  2. 指数
    接下来的E是指数,一共8位,也用二进制来表示。
  3. 尾数
    最后的F是小数部分,尾数正是由这23位的小数部分+1位组成的。(这个稍后解释)。

虽然指数也是用8位二进制来表示的,但是IEEE在定义它的时候做了些手脚,使用了偏移来计算指数。

IEEE规定,在float类型中,用来计算指数的偏移量为127。也就是说,如果你的指数实际是0,那么在内存中存的就是0+127=127的二进制。


3.头文件大小写需要区分吗?

在windows操作系统下,头文件大小写不区分;

Linux操作系统下,需要区分。




原创粉丝点击