同和网站建设,成都市区必去的景点,什么网站可以自己做房子设计图,ui培训公司这个问题主要是在从对一个变量进行符号判断引出#xff0c;有一种判断方法是#define ISUNSIGNED(Value) (Value 0 ~Value 0)
主要是通过将符号位取反然后将变量与0进行比较。传入int与unsigned int结果正确#xff0c;但是当传入unsigned char 与unsign…这个问题主要是在从对一个变量进行符号判断引出有一种判断方法是#define ISUNSIGNED(Value) (Value 0 ~Value 0)
主要是通过将符号位取反然后将变量与0进行比较。传入int与unsigned int结果正确但是当传入unsigned char 与unsigned short 并赋值0时结果为0.如下图 查了汇编代码发现原因是数据长度问题。当数据长度低于int长度时候会出现该问题。具体看下图所示汇编。将test_c取反后赋值给tmp应该是0XFF又test_c是无符号结果应该是255.但是通过汇编可以看到首先将test_c移动到eax寄存器并无符号扩展。但是接下来not操作对象是eax寄存器和test_c无关了而默认数据类型是int有符号因此结果就是一个有符号数了再与0比较也无法得到正确结果。 解决方法
有两种方法
1、既然问题是判断对象是返回的int那再通过赋值将结果进行截取为源类型即可解决问题#define ISUNSIGNED(Value) (Value0 (Value~Value)0)
2、同理通过直接操作符号位同理需要重新赋值。不能直接1n位否则结果一样是int。
#define ISUNSIGNED(Value) ((Value|1(8*sizeof(Value)-1))0)
二者缺陷也很明显对一个数据进行判断确改变了值。需要再加一步相反的操作进行还原。