数据类型

1.常量和变量

1.1关键字

C的关键字共有32个
·数据类型关键字(12个)
char, short, int, long, float, double,unsigned, signed, struct,union, enum, void
·控制语句关键字(12个)
if,else, switch, case, defaultfor, do, while, break, continue, goto, return
·存储类关键字(5个)
auto, extern,register,static,const
·其他关键字(3个)
sizeof, typedef, volatile


1.2 数据类型

数据类型的作用:告诉编译器定义这么一个类型的变量需要分配多少空间


1.3 常量

int main(int argc,char *argv[])
{
        //1、常量:程序运行期间,不允许修改
        //10=1;//err此处会运行错误,10不可能等于1,而这里有没有整型,没有对它进行赋值,则会出现错误
}

1.4变量
1)变量

//变量
{
//1.程序运行期间,允许修改
//2.变量名字遵循命名规范(有数字、字母、下划线组成,首字母不能是数字)
//3.定义变量时,必须有相应的类型
//4.同一个{}内部,不能出现2个同名变量的定义

//定义一个变量,变量名字叫a,它的类型为int整型
int a;
a =10;

return 0;
}

2)声明和定义区别
使用示例:

//extern是一个关键字,声明一个变量,声明变量没有建立存储空间(暂时了解,后面再学习)
extern int d;
d=1;//err,d还没有定义,没有定义就没有空间,没有空间就不能赋值
return 0;

int b 它既是声明,同时也是定义
extern b 它只是声明不是定义

3)常用代码和变量示例代码

//#include <stdio.h>
//1、#开头的语句是预处理语句,无需分号结束
//2、定义一个宏定义的标示符MAX,它代表100,MAX它是常量
//3、宏定义以后的代码都可以使用MAX
//4、在后面出现的MAX,
预处理都会替换为100

#define MAX 100
int main(int argc,char *argv[])
{
         //10 = 1;
         //MAX=1://MAX它是常量,不允许修改
         MAX;
         MAX;
int b= MAX; 

//const是一个关键字,作用是修饰一个变量为只读
const int c=10;
c=100;//err,c只读,不允许修改

int e=c;//把c的值给e,c本身没有变量

int d;
d=100;//ok,变量可以修改
return 0;
}

2.进制

左边是高位,右边是低位

当前的计算机系统使用的基本上是二进制系统,数据在计算机中主要是以补码的形式存储的


注释:b(小写)是在二进制中以1和0为单位
B(大写)是以8进制为单位,相当于3个2,也就是b的8倍
1k,1K是1024为单位
1kb,1KB也是1024
 

2.1 二进制

3210逢2进1
1011
10101111

2^3

02^10=1011010
0110
02^22^10=6
1111
2^32^22^12^0=15
8421


2.2 八进制

3210逢8进1
7011
10011215

8^3

008^0=51310226
0240
02*8^24*8^10=160

2.3 十六进制
 

3210逢16进1

f为15

f991
1001129cc为12

16^3

0016^0=409710c2d
1213
0240
02*16^24*16^1=576


10~15       16为10
A~F           

2.4十进制转2/8/16进制
注释:10位数除以2/8/16,除到整数为零,除不尽时为1,除比它小的数时为零,余数放旁边最后将余数倒过来看就是结果

256余数
2280
2140
270
231
211
01

2.5 十进制的小数转换成二/八/十六进制:小数部分和2/8/16相乘,取整数,不足1取0,每次相乘都是小数部分,顺序看取整后的数就是转化后的结果

2.6八进制和十六进制相互转换(先借助2进制再转)

2.4C语言如何表示相应进制数
十进制       以正常数字 1-9开头,如 123
八进制       以数字0开头,如 0123
十六进制   以 0x开头,如 0x123
二进制      C语言不能直接书写二进制数

#include <stdio.h> h>
int main()
{
          int a= 123;           //十进制方式赋值
          int b=0123;          //八进制方式赋值,以数字0开头
          int c=0x123;      //十六进制方式赋值

//如果在 primntf中输出一个十进制数那么用%d,八进制用%o,十六进制是%x

printf("十进制:%d\n",a);
printf("八进制:%o\n",b);//%o,为字母。,不是数字
printf("十六进制:%x\n",c);

retun 0;
}

2.3 计算机内存数值存储方式

1)存储1字节(8位)大小的数字(char)

2.3.1 原码

原码(用户角度):原始的二级制
1.用户的数字分为正负数,符号位的存储
2.最高位为符号位:0代表为正数,1代表为负数
3.1000  00001左边是高位,右边是低位
+1:0000 0001
-1:1000 0001
+0:0000 0000
-0:1000 0000

原码存储导致2个问题:
1.0有两种存储方式
2.正数和负数相加,结果不正确(计算机只会加不会减)
1-1=1 + -1
 1:0000 0001
-1:1000 0001
    1000 0010=  -2

2.3.2 反码

反码(为了算补码):
1.求原码
2.在原码基础上,符号位不变,其它位取反 (0为1,1变0)
3.正数的原码和反码是一样的
    +1:000 0001
     -1:1111 1110
    +0:000 0000
     -0: 1111 1111
反码储存导致1个问题:
0有两种储存方式(相当于把1+-1变为了0的存储方式)
以反码来算:
1-1=1+-1
1:   0000 0001
-1:  1111 1110
       1111 1111 =-0


2.3.3 补码

计算机存储数字以补码方式存储(为了解决负数的存储)
1、正数的原码、反码、补码都一样
2、补码为其反码+1
1,+1:0000 0001
      -1:1111 1111
     +0:0000 0000
     -0:10000 0000(最高位丢弃)= 0000 0000
以补码来算:
1-1=1 + -1
  1:0000 0001
 -1: 1111 11111
    10000 0000(最高位丢弃)= 0000 0000

2.3.4 补码的意义

10进制数,站在用户的角度,原码
二进制、八进制、十六进制,站在计算机角度,补码

原码求补码:
1) 最高位符号位,其它位就是二进制(原码
)2 在1)基础上,符号位不变,其它位取反
3) 补码在2)基础上加1

补码求原码:
//二进制、八进制、十六进制,站在计算机角度,补码
//0x81转化为二进制位1000 0001,最高位为1,说明是负数
char a=0x81;
补码:1000 0001
反码:1111 1110
原码:1111 1111=-127
//10进制数,站在用户的角度,原码
printf("号d\n",a); //-127

0x6f的二级制为0110 1111,最高位为0,它是正数
char c=0x6f;
printf("%d\n",c);

//10进制数,站在用户的角度,原码
int a=-123;
原码:1000 0000 0000 0000 0000 0000 0111 1011
反码:1111 1111 1111 1111 1111 1111 1000 0100
补码:1111 1111 1111 1111 1111 1111 1000 0101
             f       f       f      f      f         f       8        5

%x默认以4个字节(32位)大小打印号
//二进制、八进制、十六进制,站在计算机角度,补码
printf("号x\n",a);

1有符号和无符号的区别:
1)有符号,最高位是符号位,如果是1代表为负数,如果为0代表为正数
2)无符号,最高位不是符号位,是数的一部分,无符号不可能是负数
int main(int argc,char *argv[])
{
               printf("%d\n",0x8000007b);
               printf("%u\n"0x8000007b);
             //等价于int =-10;
             siqned int a=-10;
            unsigned int c=10;
            unsiqned int c=0x8000007b;//无符号不可能是负数
        printf("c = "%d\n', c);//输出结果以号d为准,&d默认以有符号方式输出
        
printf("c = "%u\n', c);

       return 0;
}

数据类型范围(站在10进制角度,原码)
char 1个个字节
有符号的范围:
正数:
0000 0000  ~  0111 111
0                      127
负数:
1000 0000  ~ 1111  111
               -0 ~ -127
-0当做 -128使用
-128:
原码:1 1000 0000
反码:1  0111 1111
补码:1 1000 0000
(最后补码和原码的值是一样的,所以-0可以看作-128)

无符号范围:
0000 0000~1111 1111
               0~ 255
char :
有符号:-128~127
无符号:0~255

 赋值或者运算,记得不要越界
char a  = 127=+2
129转换为二进制1000 0001,这是负数补码
补码:1000 0001
反码:1111 1110
原码:1111 1111(最高位是符号位)  -127
printf("%d\n",a);
unsigned char b=255+2;
257转化为二进制0001 0000 0001(只取后8位)
printf("%u\n",b);

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值