在涉及溢出错误的情况下,从int转换为char

Converting from int to char where overflow errors are concerned

本文关键字:int 转换 char 情况下 溢出 错误      更新时间:2023-10-16

如果可能发生溢出错误,从较大的整型转换为较小的带符号整型不是一个坏主意吗?我对C++Primer(17.5.2)中演示低级IO操作的代码感到惊讶:

int ch;
while((ch = cin.get()) != EOF)
    cout.put(ch); //overflow could occur here

考虑到

  • cin.get()将获得的字符转换为unsigned char,然后转换为int。因此ch将在0-255的范围内(不包括EOF)。一切都很好
  • 但随后在put(ch)表达式中ch被转换回char。如果charsigned,那么来自128-255ch的任何值肯定会导致溢出

如果我期望的是普通输入0-127之外的东西,那么这样的代码通常会是一种糟糕的做法吗?因为无法保证如何处理溢出?

整数降级有一些规则。

当长整数被转换为短整数或短整数被转换成字符时,保留最低有效字节。

如图所示:https://msdn.microsoft.com/en-us/library/0eex498h.aspx

因此,ch的最低有效字节将被保留。一切都很好。

如果您想将整数转换为以null结尾的字符串来表示它,请使用itoa。

char *  itoa ( int value, char * str, int base );

或者您可以将其转换为字符串,然后char:

std::string tostr (int x){
    std::stringstream str;
    str << x;
    return str.str();}

将字符串转换为字符

string fname;
char *lname;
lname = new char[fname.lenght() + 1];
strcpy(f, lname.c_str());

如果您看到"安全错误",请使用#Pragma 禁用它