quote:以下是引用划痕在2011-10-24 16:39:09的发言:
今天才注意到这个帖子,就简单补充一下:
将Boolean量取反输出的C代码严谨的写法如下
SetTagBit("Tag",(short)!(GetTagBit("Tag")));
//得到Tag的值取非,写回去!
而此语句SetTagBit("Tag",!GetTagBit("Tag"));//在编译过程中会出现警告
仔仔细细的看完划痕的回复,思想活动和动作过程如下:
1.不用编译器,不用环境。我肉眼看上去,百思不得其解,这个逻辑,这个变量长度都不会有错啊!
2.所以我打开了我心爱的VM,快速的Resume了我WinCC 6.2 Sp2 Asian。测试!
3.测试结果
Warning(0011) : conversion may loose information4.乖乖 还真有报错? 胡乱翻译一下:转换可能丢失信息 我:意思是说这里面涉及到数据类型的转换?
5.仔细一看都是Boolean型的操作啊?等等……Boolean型?我记得很多C编译环境都不支持Boolean啊!我们以前要用Boolean 都是
#define TRUE 1
#define FALSE 0
GetTagBit("Tag")明明白白的写着return type 是BOOL 难道我对它的返回值进行!操作就要报错?
6.再做测试 !GetTagBit("Tag"); 测试结果:没有错误!
7.奇怪了,不急不急 还有半截我们没有测试呢 SetTagBit 先看看它的定义!
SetTagBit
Function
Sets the value of a tag of data type "Binary tag".
Syntax
BOOL SetTagBit(Tag Tag_Name, short int value);
Tag_Name
name of the tag
value
Value of the tag in the data type "short int"
8.乖乖,看见没 看见没人家清清楚楚明明白白的写着 Short Int 短整型啊!
9原来 SetTagBit(Tag, value); 中的value是短整型,这里我们将一个布尔型“隐式”的转换成了一个短整型。就相当于用更大的存储空间存了一个需要空间很小的值。出现了存储空间大小的变换。所以出现警告,但是这个警告完全可以不去纠结它,因为是小到大,不是大到小。不会loose information的!
放心使用!
报告组织思想活动和实际行动汇报完毕!
BTW: 划痕大侠 我咋感觉我们认识呢?好像还在哪里一起讨论过问题!好像是PCS7的问题的!