beny 发表于 2011-5-26 17:02:31

ICC7.22中如何对unsigned long型的数据进行按位取反?

我在程序用用到long型数据,每一位代表不同的意义,我在取反的时候,ICC7.22只能到16位,具体如下:
unsigned long x=0x00008000;
unsigned long y;

y=~x;


我调试的时候,y=0x00007FFF;而y=0xffff7fff才对。

请教在什么地方设置下ICC或者如何对32位数据进行按位取反??谢谢

beny 发表于 2011-5-27 08:54:14

帖子沉的太快,顶一下,希望有高手赐教

millwood0 发表于 2011-5-27 09:38:01

read a decent C book on type promotion.

beny 发表于 2011-5-27 10:50:09

查资料:unsigned char、char、bool等低于int型的类型,进行运算的时候都要先提升再运算,提升时根据signed和unsigned,在前面补位为0或者1,若是unsigned,则直接前面全补0;若为signed,则根据最高位为0还是1,若为0则全部补位为0,若为1则全部补位为1。

那long高于int型的类型,我只能低16位取反,高16位取反,再合并起来这种方式吗?

beny 发表于 2011-5-27 11:03:59

我之前项目中也用到对long型取反,但没遇到这样的问题,用ICC 6.3编译的。

Gorgon_Meducer 发表于 2011-5-27 15:44:55

没有验证过……如果真是这样……那就是bug了……
你可以用ICC生成coff文件,然后用avr studio4的simulator仿真,看看真相。

beny 发表于 2011-5-27 16:57:58

应该不是ICC的bug,刚专门找了个xp的台式机,装了icc6.3,调试了下,结果一样。

可还是有点不理解,正在网上查相关资料,不知道有没有其他人遇到这样的问题。

avr studio4的simulator仿真我一直没用过,也是设断点吗?进不去断点

walshao 发表于 2011-5-27 17:01:26

没这么用过,看看

millwood0 发表于 2011-5-27 18:32:22

"我只能低16位取反,高16位取反,再合并起来这种方式吗?"

dense, very dense.

try:

"unsigned long x=0x00008000ul; " instead.

first_blood 发表于 2011-5-27 19:40:07

LZ是个大骗子

面对楼主的疑问,我很蛋疼的用ICC7.22+AVR studio 仿真了下
http://cache.amobbs.com/bbs_upload782111/files_40/ourdev_643588HWILRX.JPG
(原文件名:test.JPG)

一切正常啊

beny 发表于 2011-5-28 10:34:42

http://cache.amobbs.com/bbs_upload782111/files_40/ourdev_643666NXTM48.jpg
(原文件名:01.jpg)
第一次断点Alarm_Types的值。
http://cache.amobbs.com/bbs_upload782111/files_40/ourdev_643668G2WPWX.jpg
(原文件名:02.jpg)
下个断点Alarm_Types的值。
图片中的y和xxxxx
unsigned longxxxxx=0x00080000;
unsigned longy;
http://cache.amobbs.com/bbs_upload782111/files_40/ourdev_643671FKCZGB.jpg
(原文件名:02.jpg)
仿真确实是正确的。上面的Alarm_Types为什么不对呢?

beny 发表于 2011-5-28 10:37:17

回复【9楼】first blood
lz是个大骗子
面对楼主的疑问,我很蛋疼的用icc7.22+avr studio 仿真了下

也许我水平确实很差,但我是在请教,我骗你发不了家。

yyccaa 发表于 2011-5-28 11:32:57

仿真确实是正确的。上面的Alarm_Types为什么不对呢?
-----------------------------
参见3楼你自己的答案。常量也是有类型的,根据范围来定,默认是有符号的。

beny 发表于 2011-5-28 12:06:32

谢谢【12楼】 yyccaa,millwood0,及各位高手
#define        PROBE_Down_Alarm                0x00000100ul//探头脱落
在数据后面加了ul,现在仿真ok了。

常量也是有类型的,根据范围来定,默认是有符号的。受教了,谢谢

leirui001 发表于 2014-6-13 18:15:09

在缺省情况下,整型文字常量被当作是一个 int 型的有符号值
受教了谢谢
页: [1]
查看完整版本: ICC7.22中如何对unsigned long型的数据进行按位取反?