在c ++中比较char到Int

时间:2014-04-05 16:18:49

标签: c++ types casting char int

在c ++中,由于隐式类型转换,可以将int与char进行比较吗?或者我误解了这个概念?

例如,我可以吗

int x = 68;
char y;
std::cin >> y;
//Assuming that the user inputs 'Z';
if(x < y) 
{
 cout << "Your input is larger than x";
}

或者我们是否需要先将其转换为int?

所以

 if(x < static_cast<int>(y)) 
{
 cout << "Your input is larger than x";
}

4 个答案:

答案 0 :(得分:5)

两个版本的问题在于,您无法确定由负值/大值导致的值(如果char确实是{{1},则值为负值})。这是实现定义,因为实现定义了signed charchar还是signed char

解决此问题的唯一方法是首先转换为适当的签名/未签名 char 类型:

unsigned char

if(x < (signed char)y)

省略此强制转换将导致实现定义的行为。

就个人而言,当使用字符作为数字时,我通常更喜欢使用if(x < (unsigned char)y) uint8_t,正是因为这个问题。


这仍假设int8_t的值在您平台上可能的(un)signed char值范围内。如果int可能不是这种情况(仅当sizeof(char) == sizeof(int) == 1为16位时才可能!),并且您正在比较有符号和无符号值。

要避免此问题,请确保使用

char

signed x = ...;
if(x < (signed char)y)

如果你没有这样做,你的编译器会抱怨有关混合签名比较的警告。

答案 1 :(得分:3)

您的代码将编译并工作,用于某些工作定义。

您仍然可能会收到意外结果,因为ychar,这意味着其签名是实现定义的。结合未知的int大小将带来很大的乐趣。

另外,请写下你想要的字面文字,不要自己查看ASCII表。任何读者(你在5分钟内)都会感激不尽。

最后一点:避免使用gratuituous,他们不会做任何更好的事情,并可能隐藏编译器通常会警告的问题。

答案 2 :(得分:2)

是的,您可以将int与某些char进行比较,就像您可以将int与某些short进行比较一样,但可能会被视为不良风格。我会编码

if (x < (int)y) 

或者像你一样

if (x < static_cast<int>(y))

我觉得这个案子有点过于冗长......

顺便说一句,如果您打算使用不是char的字节,请考虑int8_t

中的<cstdint>类型(等等...)

不要忘记,在某些系统上,char默认为signed,其他系统为unsigned(您可以明确unsigned char vs {{1} })。

答案 3 :(得分:1)

您建议的代码将编译,但我强烈推荐static_cast版本。使用static_cast,您将帮助读者了解您与整数的比较。