我是嵌入式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?
答案 0 :(得分:4)
问题似乎是char
是signed
还是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。