在C ++中从char到int的类型转换 - 奇怪的价值

时间:2014-05-19 11:50:09

标签: c++ casting

我无法弄清楚为什么这个结果会出现未定义的行为或其所谓的?

 char ch[10];
 strcpy(ch, "street1-3");

 char ch2 = ch[6];

 cout << ch2 << endl;
 int n = (int) ch2;
 n = n * 12;
 cout << n << endl;

即cout首先打印出street1-3的位置6,即&#34; 1&#34;。 然后,当我试图将这个char类型转换为int时,该值变为不是它预期的值,即12,而不是588。

在consolewindow中输出

 1
 588

我在类型转换中做错了什么以及它是如何解决的?

4 个答案:

答案 0 :(得分:8)

字符'1'的ascii值不是1。所以(int)'1' != (int)1

如果您查看ASCII表格,您会看到'1' == 49,巧合(或不是......)49*12 == 588

答案 1 :(得分:0)

(int)ch2告诉编译器将ch2中的char值解释为int。由于字符按ascii值存储,ch2包含49,这是计算使用的内容。

而不是(int)ch2,而应使用int(ch2)代替{{1}},这将执行您期望的转化。

哦,你应该总是在可能的情况下避免使用c ++中的c样式转换 - c ++提供了许多你应该使用的更安全的转换(动态,静态等)。

答案 2 :(得分:0)

运营商<<charint有两种不同的行为。使用char,您将获得相应的字符,即"1",其ascii值为49。因此,当您执行int n = (int)ch2时,n的值为49,则n * 12等于588,因为n是一个int,因此将其作为值输出

答案 3 :(得分:0)

AS ch2 = 1,类型为'char',当它被类型转换为'int'时,它取ASKII值1为49,并将其赋值为'n'。并且49 * 12是588,这是您的程序的输出。