比特鹏哥第九节课

c语言第七节课

操作符详解

1 .>> 右移操作符

比特鹏哥第九节课_第1张图片

image-20220424132706022

int a=16用二进制表达2为00000000000000000000000000010000

像右移操作符有两种移法

右边丢弃左边补符号位 相当于除2

整数的二进制表示有:原码 反码 补码

进行移位操作时操作的是补码 正数的补码是他本身 负数的补码是原码按位取反加1(除了符号位)

左移操作符使值扩大两倍

按位与& E6TRGDEWRTHGRWDEQTRGHEF1QRFTGHERSQW2HFBGTY26YU7T342RHNJUGCFBGHJNTV a 补码进行操作 全为1则为1否则为0

按位或| 补码进行操作 有一个为1则为1 否则为 0

按位异或 ^ 补码进行操作 相同则为0 否则为1

赋值操作符可以连续使用

a=x=y+1

求二进制包含多少个1
int i = 0;
    int temp = 0;
    int count = 0;
    int des;
  /*  printf("%d",15>>33);*/
    printf("请输入数字");
    scanf("%d",&temp);
    for ( i = 0; i <32; i++)
    {
    
    
        if (1 == (temp >> i & 1)) {
            count++;
            printf("%d  %d\n", i, temp >> i);
        }
        des = temp / 2;
        if (des < 0) {
            break;
        }
        {

        }
    }
    printf("一共有%d个1", count);

注意这里条件要不能包括32 因为移动相当于位宽时会看编译器,可能导致答案错误

比特鹏哥第九节课_第2张图片

答案为2,0

因为把a+5的结果放进来s里面 s是shrot类型 所以sizeof判断的是short的所占空间大小

s=0是因为sizeof里面的代码不会进行真实的运算

把11变成15把15变成11

11的二进制为1011 前面的0就不补了

1011 ->1111

1011 | 4

image-20220425131056677

前面几位都是0

隐式类型转换

    char a = 3;
    char b = 127;
    char c = a + b;
    printf("%d",c);

a的二进制表示为00000000000000000000000000000011

b的二进制表示为000000000000000000000000001111111

要转成补码运算 因为正数三码合一

因为他们都是char类型占1字节所以要进行阶段从低位开始取

a 00000011

b 011111111

按照规定进行整形提升往前面补符号位直到32bit为止

整型提升是C程序设计语言中的一项规定:在表达式计算时,各种整型首先要提升为int类型,如果int类型不足以表示则要提升为unsigned int类型;然后执行表达式的运算。

a 00000000000000000000000000000011

b 000000000000000000000000001111111

a+b=

000000000000000000000000010000010

然后要放到char类型要进行截断

c=10000010

要进行整数输出还要进行整形提升 补符号位

11111111111111111111111110000010

然后这是补码要变成原码

11111111111111111111111110000001 反码

100000000000000000000011111110

所以整数输出为-127

整个过程进行了两次整形提升

两次截断

比特鹏哥第九节课_第3张图片质只要参与了运算 就会发生整形提升

算数转换

比特鹏哥第九节课_第4张图片

写一个函数返回参数二进制中 1 的个数 比如: 15 0000 1111 4 个 1
int  count_one_bits(unsigned int value)
{
    // 返回 1的位数
    int i = 0;
    int count = 0;
    for (i = 0; i < 32; i++) {
        if (1 == (value>>i & 1)) {
            count++;
            
        }
        
    }
    return count;
}
2.获取一个数二进制序列中所有的偶数位和奇数位,

分别输出二进制序列。

  int a = 0;
    int i = 0;
    scanf("%d",&a);
    for (i = 31; i > -1; i--) {
        printf("%d",(a>>i&1));
    }
    printf("\n偶数位\n");
    for (i = 31; i > -1; i -= 2) {
        printf("%d", (a >> i & 1));
    }
    printf("\n奇数位\n");
    for (i = 30; i > -1; i -= 2) {
        printf("%d", (a >> i & 1));
    }
两个int(32位)整数m和n的二进制表达中,有多少个位(bit)不同?
   int a = 0;
    int i = 0;
    int count = 0;
    int b = 0;
    scanf("%d %d", &a,&b);
    for ( i = 0; i < 32; i++)
    {
        if ((a>>i&1)!=(b>>i&1))
        {
            count++;
        }

    }
    printf("%d", count);

指针

ques1:

既然所有指针的大小都是四字节,为什么还要区分这么多类型吗 比如int* char * short*

比特鹏哥第九节课_第5张图片

可以看到存储地址确实没有什么大问题

  int a = 0x11223344;
    //char* b = &a;
    int* c = &a;
    *c = 0;

image-20220425163841546

通过使用相同类型的指针可以成功修改值

   int a = 0x11223344;
    char* c = &a;
    //int* c = &a;
    *c = 0;

image-20220425164056297

使用插char类型的指针操作int数据,只操作了一个字节

结论:指针类型决定了指针解引用能够访问空间的大小

第二个意义:

指针加减整数

指针的类型决定了指针一步走多远也就是步长距离的单位就是字节数

比特鹏哥第九节课_第6张图片

野指针

:指针指向的位置是不可知的

你可能感兴趣的:(c语言)