C语言_0217笔记_整数:字长bit位字节/sizeof/补码/整数类型的范围/输入输出与进制/8和16进制

知识点提炼

  • CPU的字长32位or64位,一次读写的内存就是一个int

  • 字长取决于数据总线宽度,代表一次可以取多少的数据。地址总线,相当于取数据的地址范围,可以这样比方,地址总线——旅馆里的房号;数据总线——一间房的大小。

  • bit指的是比特,就是“位”,8bit=1byte是字节

  • cpu的字长是32位,就是它一次能读取32个0或者1,由于8 bit 等于 1byte (注意单位,bit指的是比特,就是“位”,byte是字节)所以32个0或1 就是4字节

  • int数据类型表示4个字节

C语言的类型

各种类型不同之处的表现

运算符sizeof

  • sizeof:属于(静态)运算符,可以给出某个类型或者变量在内存里占据的字节数。//sizeof(int) sizeof(i)

  • //4个字节 一个字节8个bit,因此是一个32位bit的变量

  • int类型字节长度为4,double类型字节长度为8,longdouble类型字节长度为16;

  • 注意:其结果在编译的时候就已经确定,与程序执行阶段无关,所以不能用来计算。但是可以放表达式。

  • 因为C自动转换了这个表达式,其类型为double,所以字节长度是8,并非真正的计算

int a;
sizeof(a+1.0)
结果为->8,

整数类型

五种整数类型:char short int long longlong

整数类型的大小

结果:字节//-32的意思是当作32位的机器来做处理

  • int字节长度实际上是寄存器存放的字长(寄存器一次可以处理的数据大小),比如32位是32bit=4字节,64bit目前更长见

整数的内部 二进制/补码

怎么表达负数?——补码

  • 补码的意义就是拿补码和原码相加会得到一个溢出的0.【零溢出事件】

整数的范围

  • char:1 字节,short:2 字节,int: 4字节,long: 8字节,longlong: 8字节

  • int的范围:-2^(32-1)~2^(32-1)-1 //4字节,一个字节8bit,4*8=32

  • 对于一个字节(8位)可以表示的数为:00000000~11111111

//其中00000000表示十进制0,11111111~10000000表示(-1)~(-128),00000001~01111111表示1~127

只有char类型下的11111111表示-1,因为只有一个字节,char类型数据范围为-128~127.

unsigned:纯2进制

  • 如果想要单纯的表示0~255,不要补码。需要在数据类型前面加上unsigned。

unsigned char a=255;

输出a会得到255.如果只是char a=255,则输出a会得到-1.

  • 副作用,能表达的数的范围变化了,从-128-127变成了0-255。

  • 补充:如果是一个字面量变量想要表示自己是unsigned可以在后面加上u或U,表示自己是long可以加l或L。但unsigned的意义不止是扩大表达范围,而是为了做纯二进制数的计算,主要是为了移位

整数的越界

  • 在一个字节(char int)的计算中,-1+1=0,127+1=-128.0-1=-1,-128-1=127

    char c=127;
    c+=1;
    printf("c=%d",c);//c=-128 越界了
unsigned char c=127;
c+=1;
printf("c=%d",c);//c=128 unsigned不考虑补码,纯二进制的计算
        unsigned char c=255;
        c+=1;
        printf("c=%d",c);//c=0 256 8个bit 1 0000 0000 =====1被丢掉
  • 在一个字节8位(8个bit/ 一个字节)

int数据类型的最大数

2的31次方2147483648

2^31-1,是32位操作系统中最大的符号型整型常量

 int a=0;
 while(++a>0)
              ;
 printf("int数据类型的最大数是:%d\n",a-1);//int数据类型的最大数是:2147483647

整数的输入输出(格式化)

  • printf/scanf:整数的输入输出实际上只有两种:int类型和long long类型

  • 所有小于int,char short int ——%d

  • 所有比int大的,long longlong——%ld

  • unsigned(纯二进制)是例外且这两种都可以加,因为这两种实际上没有区别,只是我们看待他们的方式不同,

char c=-1;
    int i=-1;
    printf("c=%u,i=%u\n",c,i);
    return 0;
  • 这一串数字即为unsigned int可以表示的位数,按理来说c的结果不应该是这个,但是printf这个函数在传递小于int的变量类型时会将其转换为int,所以二者结果相等。

如何选择整数类型:int

  • 为什么有那么多的整数类型!原因是早期的语言需要准确表示计算机内部的结构、接口等。 那今天我们学习时候如何选择整数的类型呢?

  • 没什么特殊需要,就用int

8进制和16进制

  • 以0开头的数字字面量为八进制,以0x开头的数字字面量为十六进制。//输出%d的意思就是想看到10进制的结果

    char c=012;
    int i=0x12;
    printf("c=%d,i=%d\n",c,i);//c=10;i=18
(这个程序的内核其实是,你将一串数字定义为八进制或者十六进制,然后让计算机转换成十进制并输出。当你将格式化输出符更改之后,这些数字的意义也就随之改变了。比如)
  • 八进制和十六进制很适合表示二进制数据。因为四位二进制为一个十六进制位。三位二进制为一个八进制位。

  • printf和scanf的进制形式

  • c=%d//想要输出形式十进制

  • c=%o//想要输出形式八进制

  • i=%x;//想要输出形式16进制 —— %x输出小写,%X输出大写字母。16进制中有字母,小写x输出小写字母,大写X输出大写字母。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值