jiege0119 发表于 2013-4-19 15:53:17

请教一个32位整型取反的问题

    调试板子时出现一个错误,然后查看了一下汇编代码后发现:

   ~0X00008000的结果是0X00007FFF;

而 ~0X00007000的结果就是0XFFFF8FFF

经过几次不同数据的试验,好像第15位为1,则高16位就不取反,而第15位为0,则高16位也会取反,

这是什么情况呢?        e = ~0x00007000;
1c0:        8f ef               ldi        r24, 0xFF        ; 255
1c2:        9f e8               ldi        r25, 0x8F        ; 143
1c4:        af ef               ldi        r26, 0xFF        ; 255
1c6:        bf ef               ldi        r27, 0xFF        ; 255
1c8:        8d 83               std        Y+5, r24        ; 0x05
1ca:        9e 83               std        Y+6, r25        ; 0x06
1cc:        af 83               std        Y+7, r26        ; 0x07
1ce:        b8 87               std        Y+8, r27        ; 0x08
        e = ~0x00008000;
1d0:        8f ef               ldi        r24, 0xFF        ; 255
1d2:        9f e7               ldi        r25, 0x7F        ; 127
1d4:        a0 e0               ldi        r26, 0x00        ; 0
1d6:        b0 e0               ldi        r27, 0x00        ; 0
1d8:        8d 83               std        Y+5, r24        ; 0x05
1da:        9e 83               std        Y+6, r25        ; 0x06
1dc:        af 83               std        Y+7, r26        ; 0x07
1de:        b8 87               std        Y+8, r27        ; 0x08
        e = ~0x00008001;
1e0:        8e ef               ldi        r24, 0xFE        ; 254
1e2:        9f e7               ldi        r25, 0x7F        ; 127
1e4:        a0 e0               ldi        r26, 0x00        ; 0
1e6:        b0 e0               ldi        r27, 0x00        ; 0
1e8:        8d 83               std        Y+5, r24        ; 0x05
1ea:        9e 83               std        Y+6, r25        ; 0x06
1ec:        af 83               std        Y+7, r26        ; 0x07
1ee:        b8 87               std        Y+8, r27        ; 0x08

shark 发表于 2013-4-19 16:00:41

默认整数常量是int16,试试:
~0X00008000L
~0X00007000L

jiege0119 发表于 2013-4-19 16:05:41

本帖最后由 jiege0119 于 2013-4-19 16:10 编辑

shark 发表于 2013-4-19 16:00 static/image/common/back.gif
默认整数常量是int16,试试:
~0X00008000L
~0X00007000L

嗯,这样是可以的,我不明白的是为什么~0X00007000就当32位取反,而~0X00008000就只有16位取反了

dr2001 发表于 2013-4-19 16:07:38

jiege0119 发表于 2013-4-19 16:05 static/image/common/back.gif
嗯,这样是可以的,我不明白的是为什么~0X00007000L就当32位取反,而~0X00008000就只有16位取反了 ...

没有尾巴的常数是int类型。

jiege0119 发表于 2013-4-19 16:15:00

dr2001 发表于 2013-4-19 16:07 static/image/common/back.gif
没有尾巴的常数是int类型。

如果这个数小于0X00008000,那么没有尾巴也是按32位的来处理

shark 发表于 2013-4-19 16:18:19

jiege0119 发表于 2013-4-19 16:05 static/image/common/back.gif
嗯,这样是可以的,我不明白的是为什么~0X00007000就当32位取反,而~0X00008000就只有16位取反了 ...

我猜可能是这样的:
~0X00008000==>~0x8000,这是个负数,所以取反之前自动扩展了符号位到高16位==>~(0xFFFF8000) ==> 0x00007FFF

~0X00007000 ==>~0x7000 , 这个是正数, ===========================> ~(0x00007000) ==> 0xFFFF8FFF

页: [1]
查看完整版本: 请教一个32位整型取反的问题