如何强制类型转换在C字面
-
20-09-2019 - |
题
我有一个小样本函数:
#define VALUE 0
int test(unsigned char x) {
if (x>=VALUE)
return 0;
else
return 1;
}
我的编译器警告我说的比较(X> = VALUE)是在所有情况下,这是正确的真实的,因为x是一个无符号的字符和值与值0,所以我改变代码来定义:
if ( ((signed int) x ) >= ((signed int) VALUE ))
但警告再来。我有三个版本的GCC(所有版本> 4.0,有时你必须启用-Wextra)。
测试了它在改变的情况下,我有这样的明确的转换,它应该是一个符号的int比较。为什么声称,该比较始终是真的吗?
解决方案
即使铸造,比较仍处于定义的行为的所有的情况下如此。编译器仍然确定(signed int)0
具有值0,并且仍然确定(signed int)x)
是非负的,如果你的程序已定义的行为(从无符号铸造到签署如果值超出了范围为有符号的类型是未定义的)。
因此,编译器将继续警告,因为它继续完全消除别的情况。
修改:要消除警告,写你的代码
#define VALUE 0
int test(unsigned char x) {
#if VALUE==0
return 1;
#else
return x>=VALUE;
#endif
}
其他提示
x
是unsigned char
,这意味着它是0到256之间,并由于一个int
比char
更大,铸造unsigned char
到signed int
仍保留char
s原始值。由于该值总是> = 0,您的if
是总是如此。
这是unsigned char
的所有值可以在int
完美杉,所以即使有投你永远不会得到一个负值。你需要演员阵容是signed char
- 然而,在这种情况下,你应该申报x
在函数签名signed
。没有一点卧而实际上你需要签署一个,你需要一个无符号价值的客户。
#define
到VALUE
的0
意味着您的功能被减少到这样的:
int test(unsigned char x) {
if (x>=0)
return 0;
else
return 1;
}
由于x
总是传递作为unsigned char
,那么它将永远有0
和255
之间的值,无论您在x
陈述投0
或signed int
到if
。因此,编译器警告您x
永远是大于或等于0
,那else
条款不能达成。
不隶属于 StackOverflow