请教一个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 默认整数常量是int16,试试:
~0X00008000L
~0X00007000L 本帖最后由 jiege0119 于 2013-4-19 16:10 编辑
shark 发表于 2013-4-19 16:00 static/image/common/back.gif
默认整数常量是int16,试试:
~0X00008000L
~0X00007000L
嗯,这样是可以的,我不明白的是为什么~0X00007000就当32位取反,而~0X00008000就只有16位取反了 jiege0119 发表于 2013-4-19 16:05 static/image/common/back.gif
嗯,这样是可以的,我不明白的是为什么~0X00007000L就当32位取反,而~0X00008000就只有16位取反了 ...
没有尾巴的常数是int类型。
dr2001 发表于 2013-4-19 16:07 static/image/common/back.gif
没有尾巴的常数是int类型。
如果这个数小于0X00008000,那么没有尾巴也是按32位的来处理 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]