如何将Signed Char与文字常量进行比较?

时间:2015-07-20 15:25:19

标签: c type-conversion

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;
}

3 个答案:

答案 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为0x000000ffff已分配给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,那就可以解释一切。由于问题很奇怪,我会问编译器预处理器输出并检查是否有任何奇怪的事情发生。