API提供了一个函数signed char getDirection();
,其中"转发" 0为"静止",-1为"后退。&#34 ;
当然,正如these questions中所述,一个简单的比较:
if(getDirection() == -1) { ... }
失败。好的,我明白为什么失败了。但我无法找到如何让它发挥作用!我尝试将左侧投向(int)
,右侧投向(signed char)
,仍然是虚无... ...
编辑:
signed char a = getDirection();
printf("%d\n",(int) a);
printf("%d\n",(int) getDirection());
结果:
-1
255
edit2:按要求:
const signed char getDirection(uchar d)
{
if(d >= config.directional_inputs.channelCount) return -2;
return shm->input_state.directional_inputs[d].direction;
}
答案 0 :(得分:0)
如果你确定getDirection()
确实返回了一个有符号的字符,那么它应该可以工作,因为0xff
的有符号字符应该正确地提升为-1整数。
如果不确定,可以尝试写
int dir = getDirection();
// optionnally for extensive tests : fprintf(stderr, "getDirection : %d\n", dir);
if ((dir == -1) || (dir == 255)) { ... }
255会捕获任何转换问题,例如getDirection()
返回已签名的字符...您的上一个编辑建议...
答案 1 :(得分:0)
似乎在GetDirection
中执行了部分return shm->input_state.directional_inputs[d].direction;
。 direction
元素的类型是什么?我不确定此处的促销活动,但如果是unsigned char
,则可能只是将其复制到返回寄存器ax
并返回。也就是说,不执行符号扩展,ax为0x000000ff
。 ff
已分配给signed char a
,这是正确的,当a
调用中使用printf
时,它会得到正确的符号扩展。因此,符号扩展必须在GetDirection
的return语句中完成,显然没有完成。
尝试将其更改为return (signed char)shm->input_state.directional_inputs[d].direction;
答案 2 :(得分:0)
这很奇怪。
首先,使用不同的编译器可能会有所不同。他们可能有不同的规则如何返回签名的char。假设用于编译函数的编译器假定signed char在32位寄存器中返回为8位,其他位为零或未定义 - -1返回为00000000 00000000 00000000 11111111.该调用的编译器假定已签名的char在32位寄存器中返回8位,符号扩展,因此可以假设所有32位都包含正确的值。所以编译器认为结果是255.
其次,我看到原型和功能不匹配的问题。如果函数的某个原型在某个地方写着“char”而不是signed char,那就可以解释一切。由于问题很奇怪,我会问编译器预处理器输出并检查是否有任何奇怪的事情发生。