从int转换为char,其中涉及溢出错误

时间:2015-12-17 15:07:16

标签: c++ c++11

如果有可能发生溢出错误,那么从较大的整数类型转换为较小的整数类型通常是一个坏主意吗?我对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,那么来自ch的{​​{1}}的任何值都会导致溢出吗?

如果我期望在普通输入128-255之外的某些东西,这样的代码通常是不好的做法,因为不能保证如何处理溢出?

2 个答案:

答案 0 :(得分:1)

整数降级有规则。

  

当一个长整数被强制转换为short时,或者short被强制转换为char时,   保留最不重要的字节。

见:https://msdn.microsoft.com/en-us/library/0eex498h.aspx

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

答案 1 :(得分:0)

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

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

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

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

将字符串转换为char

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

如果您看到&#34;安全错误&#34;使用#Pragma

禁用它