c语言易错点与细节总结

CLASS1 基本数据类型:

1.数据类型:固定内存大小的别名。是创建变量的模子。用于声明变量(4个字节大小的数据类型为int )

Char:一个字节

Short:两个字节

Int:四个字节

2.变量:一段实际连续存储空间的名字。通过变量来申请并且命名存储空间。变量的内存取决于其所属的数据类型。(3000-3004的存储空间的名字为变量i)知道存储空间名字之后,便可方便使用指定的内存空间。

3.指针:也是变量,存储的是另一个变量的地址

4.变量与类型的区别:

Sizeof(i/int):得到变量/数据类型所占的内存大小

例1:

打印出来:4,4

例2:typedef定义数据类型的关键字:

#include <stdio.h>

typedef int INT32;//INT32是新的数据类型,由int定义,即可代替int

typedef unsigned char BYTE;//同理BYTE也是新的数据类型,由unsigned char定义

typedef struct _tag_ts//_tag_ts是啥不了解,等复习了结构体再更改。

{

    BYTE b1;

    INT32 i;

    short s;

}TS;//TS代表上述结构体

 

int main()

{

    INT32 i32;

    BYTE b32;

    TS ts;//声明ts变量为结构体

    printf("%d,%d\n",sizeof(INT32),sizeof(i32));

    printf("%d,%d\n",sizeof(BYTE),sizeof(b32));

    printf("%d,%d\n",sizeof(TS),sizeof(ts));

    getchar();

    return ;

}

 

CLASS2有符号和无符号

符号位:数据类型的最高位,用于标识数据的符号。

最高位为1,数为负数

最高位为0,数为正数

练习:

#include<stdio.h>

int main()

{

    int sign=0;

    char i=-5;//char一个字节的内存,8位,数字二进制存储,-5记为11111001,规则看下一知识点

    short j=5;

    int k=-1;

    sign=(i&0x80);//0x为十六进制,转化为二进制10000000&按位与,即i为负数,则结果不为零,i为正数,结果为0

    printf("%d",sign);

    getchar();

    return 0; 

}

结果: sign非零

 

有符号数在计算机内部用补码表示:正数的补码是本身,负数补码是负数的各位取反后加1。

例2,表示7或-7:

7->111->00000111

-7->11111000+1->11111001

无符号数在计算机内部用原码表示,因为默认为正数,没有符号位。

无符号数最小为0。最大值受他所占的位数决定。

所以MAX_VALUE+1=MIN_VALUE或MIN=MAX-1

 

C语言中,变量默认为有符号数,unsigned声明变量为无符号数,signed表示有符号数。

只有整数类型(int,short,long)能够声明unsigned变量,浮点数不行。

#include<stdio.h>

int main()

{

    int i;//默认为带符号整形

    unsigned int j;//声明变量为无符号整形

    signed int k;//声明变量为有符号整形

    return 0;

}

例:求结果

#include<stdio.h>

int main()

{

    unsigned int i=5;

    int j=-10;

    if((i+j)>0)

    {

       printf("i+j>0");

    }

    else

    {

       printf("i+j>0");

    }

    getchar();

    return 0;

}

结果:!!!!!

无符号数和有符号数进行运算,有符号数自动转化为无符号数进行运算,结果为无符号数,一定大于零(-10为int(4字节,32位),转为32位2进制,同时负数首位为1,数字愈发大,为111111111。。。。。。。)

 

例:

#include<stdio.h>

int main()

{

    unsigned int i=0;

    for(i=9;i>=0;i--)

    {

       printf("%u\n",i);

    }

}

结果:无限个该些值

原因:无限:for的判断条件i>=0,无符号数最小值为0,无限满足条件。

为4294-----等数字,无符号数变为0后-1就变为最大值(最大值为4个字节(32位)的全1值)因为判断条件的设定,导致错误的使用了unsigned。因此需要慎重考虑有符号和无符号数。

 

CLASS3浮点数

浮点数在内存中的存储方式:符号位,指数,尾数,与int(整数)内存表示不同

 

符号位

指数

尾数

Float(4字节)

1位

8位

23位

Double(8字节)

1位

11位

52位(0-51)

Float和double,分别表示不同的数值范围和精度

浮点数的转换:

  1. 浮点数转换为二进制
  2. 科学记数法表示二进制浮点数
  3. 计算指数偏移后的值

注意:计算指数时需要加上偏移量,

例:对于指数6,偏移后的值:

Float :127(固定值)+6——>133

Double:1023+6——1029

例:实数8.25在内存中的float表示:

8.25二进制表示:1000.01(0.25——4的-1次)科学记数法表示——>1.00001*(2^3),二进制,后退几个小数点,2的几次。得到指数3.

符号位:0(为正数)

指数:127+3——>130——>10000010(转成8位2进制)

小数00001

所以在内存中的存储为;

  1. 10000010  00001(全0补齐位数)

例:编程实验:10进制浮点数的内存表示

 

#include<stdio.h>

int main()

{

    float f=8.25;

    unsigned int *

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值