为什么我需要将值-1转换为char(当为AVR微控制器编译时)

时间:2014-05-29 17:29:15

标签: c gcc casting avr

我是嵌入式C和C的新手。我想我可能会误解一些基本的东西,并且真的很感激一些帮助。

如果我在windows上运行它(编译器:GNU GCC编译器),我有以下函数输出“return is -1”。

#include <stdio.h>
char test();

int main()
{
    if (test() == -1 ) 
    {
        printf("return is -1");
    } 
    else 
    {
        printf("return is not -1");
    }
    return 0;
}

char test()
{
    return -1;
}

如果我为我的AVR硬件编译它,它会输出“return is not -1”,这是我无法理解的(编译器:GNU GCC编译器,avr-gcc(WinAVR 20100110)4.3.3)。

如果我将第一行更改为:

    if (test() == char(-1) ) {

然后按两种方案的预期输出“return is -1”。

为什么我需要显式地将-1转换为char?

3 个答案:

答案 0 :(得分:4)

问题似乎是charsigned还是unsigned,恰好是implementation specific

您可以通过在需要使用负值的地方专门使用signed char来解决这个问题。此外,明智的做法是确保您在比较中使用相同的数据类型(假设test()现在返回signed char):

if (test() == (signed char)(-1) ) 

答案 1 :(得分:0)

如果查看标准库,您会发现大多数处理字符值的函数(如getchar())会返回int个结果。我不知道你的test函数应该做什么,但它可能会更好地返回int而不是char

类型char可以是有符号或无符号,具体取决于实现。如果签名,其范围可能是-128 .. +127;如果它是无符号的,它的范围可能是0 .. 255。

==运算符将“通常的算术转换”应用于其操作数。这意味着,除了其他因素之外,比int更窄的整数类型的操作数被隐式转换为int(如果该类型的所有值都在INT_MIN范围内。{{1 }}或INT_MAX(否则)。

如果签名为unsigned int,则char返回的值为test,其被提升为(char)-1(类型为-1),然后与int(也是类型-1)相比 - 测试成功。

如果普通int未签名,则char返回的值为test 已转换-1。此转换可能会产生char(更准确地说,它会产生255)。因此CHAR_MAX会返回test,其被提升为(char)255 - 当然还有int

由于255 != -1值在表达式中使用时通常会被提升为char,因此您最初也可以使用int类型。

很难说出你的功能:

int

应该首先做。 char test() { return -1; } 不是有意义的字符值。

如果你真正想要的是一个非常窄的有符号整数,你可以使用-1,任何促销到signed char都会保留正确的值 - 但使用{{1}没有多大意义除非你需要为大型数组节省空间,否则不是int

(我已经掩盖了这样一个事实:signed char类型实际上可能超过8位;除非你使用DSP,否则你不太可能遇到这个问题。)

对您的代码提出更多评论:

不应使用int而不是char定义没有参数的函数。 (void)语法已过时;它表示该函数具有未指定但固定的数量和参数类型。

您需要在之前显示()函数的可见声明。将定义移到()的定义之上,或在test之上添加单独的声明(原型):

main

或者,如果您遵循我的建议:

main

(实际上你的编译器应该警告你对char test(void); 的调用没有明显的声明。找出如何提高编译器的警告级别,以便它告诉你这样的错误。)

答案 2 :(得分:-1)

因为test()上的返回类型是char。默认的返回类型是int。