1.数据存储与类型转换

来源:互联网 发布:哪种网络编程语言 编辑:程序博客网 时间:2024/05/22 09:05
转载请标明出处:http://blog.csdn.net/u012637501
一、数据存储与进制转换
1.字节:字节就是存储数据的单位,并且是硬件所能访问的最小单位。内存中存储的最小单位是位bit(0或1),但是硬件控制的时候不能精确到位,只能精确到字节(8位),是通过地址总线来控制的,而精确到位是通过软件来控制的,叫做位运算符来精确到位的。其中,1字节=8位、1kb=1024字节、1MB=1024kb、1GB=1024MB。

2G的内存条的总空间:2 *1024 * 1024 *1024 * 8 =4*10^32(位)

2.ASCII码:ASCII码不是一个值,而是一种规定。它规定了不同的字符是使用哪个整数值去表示,如'A'--65、'B'--66、'a'--97、'b'---98等
3.全局变量与局部变量
(1)变量:变量的本质是内存中一段存储空间,如int i;i=5;其中i是变量,程序向系统申请了一个内存单元(占4个字节,内存地址以字节为基本单位)。在程序运行中,i的值可以改变,但程序结束后,其所占的空间不是释放,而是被系统收回权限(即不能通过i给之前的内存单元存放数据)。
(2)全局变量
    ◇定义:在所有函数外部定义的变量叫全局变量;
    ◇使用范围:从定义位置开始到整个程序结束;
(3)局部变量
    ◇ 定义:在一个函数内部定义的变量或者函数的形参都统称为局部变量;
    ◇使用范围:只能在本函数内使用;
注意:
①在一个函数内部如果定义的局部变量的名字和全局变量名一样时(即命名冲突),局部变量会屏蔽掉全局变量
#include<stdio.h>
int i=99;        //全局变量
void f(int i)    //局部变量
{
    printf("i=%d\n",i);
}
int main(void)
{
    f(8);
    return 0;
}
运行结果为:i=8
②在同一个范围之内不能定义两个一样的变量
如void f(int i)
    {
        int i;
        printf("%d",i);
     },上述函数是不允许的。

4.sizeof(数据类型)与sizeof(变量名)
(1)sizeof(数据类型)
    ◇功能:返回值就是该数据类型在内存中所占的字节数;
    ◇举例:sizeof(int)=4 sizeof(char)=1 sizeof(double)=8
(2)sizeof(变量名)  
    ◇功能:返回值就是该变量在内存中所占的字节数;
    ◇ 指针变量:所有指针变量在内存中占4个字节数;
注意:假设p指向char类型变量(1个字节)
            假设q指向int类型变量(4个字节)
            假设r指向double类型变量(8个字节),实际上,指针变量p、q、r本身所占字节数是一样。
5.运算符
(1)&&: 左边的表达式为假,右边的表达式肯定不会执行;
      ||    : 左边的表达式为真,右边的表达式肯定不会执行;
(2) 除法"/" :除法的运算结果和运算对象的数据类型有关。若两个数都是整型,则商就是整型数据(如果商有小数则截取
         小数部分);若被除数和除数中只要有一个或两个都是浮点型数据,则商也是浮点型。
      取余"%":取余运算的对象必须是整数,结果是整除后的余数,其余数的符号与被除数相同,如13%-3=1
(3)逗号表达式
    格式:(A,B,C,D)
    功能:从左到右执行,最终表达式的值是最后一项的值。
    若j=2,则i=(j++,++j,j+2,j-3),最后的结果为i=1。需要注意的是,j+2只是个临时值,不能影响j的值。
(4) << 按位左移   
       左移n为相当于乘以2的n次方,如i<<3,表示把i的所有二进制位左移动3位,右边补零。
        举例:i=i*8;和i=i<<3;哪个语句执行的速度快?后者。因为乘法在运算器里运行原理比较复杂,按位运算则简单。
     >>按位右移
        右移n位相当于除以2的n次方,首位为0则补0,首位为1则补1.
            如i>>3 表示把i的所有二进制位右移动3位,左边补0。需要注意的是,防止过度右移,易丧失精度和意义。
位运算符意义:通过位运算符,可以对数据的操作精确到每一位。

6.进制转换问题
(1)r进制转换为十进制
    如234e是16进制,转换成2进制=2*16^3+3*16^2+4*16^1+12*16^0
(2)十进制转换成r进制
    把10进制数除以r,直到商是0的时候。然后取余数,余数倒序排列: 

(3)一个十六进制位,要用4个二进制数表示,(1)16 = (0001)2 前面补齐
(4)补码

◆已知十进制求二进制

    求正整数的二进制

    除2取余,直到商为零,余数倒序排列

    求负整数的二进制   

    先求出与该负数相对应的正整数的二进制代码,

    然后,将所有位取反末尾加1,不够位数时,左边补一

    4字节int(占32位) -5 先求5的二进制  

    0000 0000   0000 0000     0000 0000  0000 0101  所有位取反,末尾加1

    1111 1111   1111 1111     1111 1111  1111 1011   16进制:FFFFFFFB

    2字节short int(-3) 先求3的二进制

    0000 0000 0000 001     所有位取反,末尾加1  

    1111 1111 1111 1101     用十六进制表示:  FFFD

已知二进制求十进制 

如果首位是0,则表明是正整数,

按普通方法来求

如果首位是1,则表明是负整数,

将所有位取反末尾加1,所得数字就是该负数的绝对值

举例:FFFFFFF5 已知二进制  求其代表的整数是多少? 
1111 1111 1111 1111 1111 1111 1111 0101
        由于最高位是1,所以最终是负数,先对其所有取反
0000 0000 0000 0000 0000 0000 0000 1010 末尾加1后
0000 0000 0000 0000 0000 0000 0000 1011  该值为11 所以最终结果:-11
 二进制 到 十六进制 
    4位一段 从右到左 分别转化  不够左边添零
(0010 1110)2  --  (2E)16
十六进制 到 二进制   
一位转化成4位,不够左边补0  
(1)16-- (0000 0000 0000 0000 0000 0000 0000 0001)2
二进制 转到 八进制   
从右往左,三位一段 不够左边添添0
八进制 与 十六进制
     不能直接转化。通过中间进制。
(5)32位系统中一个int类型变量所能存储的数字的范围

32位系统,3201组合表示的内存单元,8个十六进制数组合

int类型变量所能存储的最大正数用十六进制表示: 7FFFFFFF

int类型变量所能存储的绝对值最大负整数用十六进制表示:80000000

      最小负数的二进制代码是多少10-0 310

      最大正数的二进制代码是多少01-1 311

      已知一个整数的二进制代码求原始的数字 

已知二进制求十进制

数字超过最大正数会怎样变成负数 0111 1111=127 1000 0000 -128

总结:32位系统中,int类型变量占4个字节,1字节=8位,共占32位
            一个十六进制用4位表示,即
                    存储的最大整数:(0111 1111 1111 1111 1111 1111 1111 1111)2 =(0x7FFFFFFF)16
                                       存储的最大负整数:(1000 0000 0000 0000 0000 0000 0000 0000)2 =(0x80000000)16
(6)不同数据类型转化
    丢失最高位.只截留后者类型所占的字节数
例如: int 类型 转化 为char 则高3位字节被截取。只保留最后一位字节。

7.++和--
(1)前自增:++i,前自增整体表达式的值是i加1之后的值;
(2)后自增:i++,后自增整体表达式的值是i加1之前的值;
    ◆两种自增最终都使i的值加1.
8.switch(表达式)的用法
switch(表达式)
{
    case 常量表达式1:语句1;
    case 常量表达式2:语句2;
     ........
    case 常量表达式n:语句n;
    default:语句n+1;
}注:default只有在前面没有遇到break,才会执行。
(1)break用法
    a) break如果用于循环,则可以终止循环;
    b) break如果用于switch,则用于终止switch;
    c) break不能直接用于if,除非if属于循环内部的一个句子。
注:Break只能用于循环和switch,不能用于if。在多层循环中,break只能终止他最近的循环;在多层switch中,break也是只能终止距离他最近的switch。
(2)continue的用法
     用于跳过本次循环余下的语句,转去判断是否需要执行下次循环。
9.NULL
二进制全部为零的含义 

---0000000000 的含义

    (1)数值零

    (2)字符串结束标记 '\0'

    (3)空指针NULL

   空指针NULL, NULL表示零而这个零不代表数字零,而表示的内存单元的编号零

我们计算机规定了,以零为编号的存储单元的内容不可读,不可写

free(p);

p = NULL;

*p = 0; 错!把0号单元改写!0单元是非常重要的数据。程序员不可能读写出0号单元信息

二、数据类型转换
1.基本数据类型
    数据类型所占字节数随机器硬件不同而不同,但1字节=8位bit.

三、简单算法
(1)素数:只能被1和自己整除的数,如1,5,9等。
(2)回文数:正着写和倒着写一样的数。如1221,121等
(3)编程实现求一个十进制数字的二进制形式:
(4)求一个数字的每位是奇数的数字取出来组合形成的新数字。
(5)求一个数字到过来的数字。
(6)斐波拉契序列:求一个数的斐波拉契序列。

0 0