StarCat 发表于 2019-11-14 12:55:00

问一个关于位操作的问题

问下各位鱼友,当一个类型的值是这个类型的最大的时候
比如 char a = 0XFF; 对这样的一个变量进行右移操作,
a= a >> 1 他为何就就会变成 0XFFFFFFFF
所以这是为什么呢。

人造人 发表于 2019-11-14 13:20:58

#include<stdio.h>

int main(void)
{
        char a = 0xff;
        a = a >> 1;
        printf("%x\n", a);
        return 0;
}



        char a = 0xff;
01181838mov         byte ptr ,0FFh
        a = a >> 1;
0118183Cmovsx       eax,byte ptr
01181840sar         eax,1
01181842mov         byte ptr ,al


#include<stdio.h>

int main(void)
{
        unsigned char a = 0xff;
        a = a >> 1;
        printf("%x\n", a);
        return 0;
}


        unsigned char a = 0xff;
00811838mov         byte ptr ,0FFh
        a = a >> 1;
0081183Cmovzx       eax,byte ptr
00811840sar         eax,1
00811842mov         byte ptr ,al

movsx       eax,byte ptr 对应 char

movzx       eax,byte ptr 对应 unsigned char



人造人 发表于 2019-11-14 13:22:34



人造人 发表于 2019-11-14 13:24:45

        char a = 0xff;
00A41838mov         byte ptr ,0FFh
        a = a >> 1;
00A4183Cmovsx       eax,byte ptr
00A41840sar         eax,1
00A41842mov         byte ptr ,al
        printf("%x\n", a);
00A41845movsx       eax,byte ptr
00A41849push      eax
00A4184Apush      offset string "%x\n" (0A47B30h)
00A4184Fcall      _printf (0A4104Bh)
00A41854add         esp,8

        unsigned char a = 0xff;
00221838mov         byte ptr ,0FFh
        a = a >> 1;
0022183Cmovzx       eax,byte ptr
00221840sar         eax,1
00221842mov         byte ptr ,al
        printf("%x\n", a);
00221845movzx       eax,byte ptr
00221849push      eax
0022184Apush      offset string "%x\n" (0227B30h)
0022184Fcall      _printf (022104Bh)
00221854add         esp,8


printf输出ffffffff同样是因为movsx 和movzx

jackz007 发表于 2019-11-14 13:27:15

本帖最后由 jackz007 于 2019-11-14 13:28 编辑

       事实恐怕和楼主说的情况有出入:
#include <stdio.h>

int main(void)
{
      unsigned char a      ;
      a = 0xff               ;
      a = a >> 1             ;
      printf("0x%02x\n" , a) ;
      return 0               ;
}

      编译、运行情况:
C:\Bin>g++ -o t t.c

C:\Bin>t
0x7f

C:\Bin>
页: [1]
查看完整版本: 问一个关于位操作的问题