【问题标题】:how I get a number outside [0,255] when doing a converson from int to char?从 int 到 char 的转换时,如何获得 [0,255] 之外的数字?
【发布时间】:2015-09-07 10:17:32
【问题描述】:

我不明白为什么从 int 到 char 的转换会给我一个超出 (char) 范围的数字?这是我的 C++ 程序:

#include <cmath>
#include <stdio.h>
int main(){
  printf("%c\n",(char) 246 );
  printf("%d\n", (char) (246) );
}

我明白了

\366
-10

有什么解释吗?我这里需要的是从 int 到 char 的转换

char int2char(int i);

将截断的“i”返回给字符。当然,可以通过一些(i mod 256) 来做到这一点,但我正在寻找一种使用类型转换来做到这一点的方法。任何想法?

【问题讨论】:

  • -10char 的范围内
  • 366 是八进制的 246。 '%c' 不打印数字的值,它打印由它表示的字符,并且您的系统/控制台似乎没有字符,因此它打印转义的八进制表示。

标签: c++ char type-conversion


【解决方案1】:

当你执行时:

printf("%d\n", (char) (246) );

相当于执行:

char c = 246;
int i = c;
printf("%d\n", i);

棘手的部分是行中发生的事情

char c = 246;

246 在二进制文件中存储为11110110

看起来在您的平台上,charsigned。当charsigned 时,该二进制数的整数值等于-10。因此,c 的值设置为-10i 的值也设置为-10

【讨论】:

    【解决方案2】:

    本机 char 类型可以是有符号或无符号的。它似乎已在您的计算机上签名。

    如果您想确保结果在[0, 255] 范围内,请改用unsigned char

    static_cast<unsigned char>(246)
    

    【讨论】:

      【解决方案3】:

      您的 C++ 编译器将 char 视为一个 有符号 8 位整数,范围为 -128 到 127,而不是一个 无符号 8 位整数范围为 0 到 255。

      问题不在于int-to-char 转换,而是char-to-int 转换,可以通过强制转换(i = (unsigned char) ci = static_cast&lt;unsigned char&gt;(c))或位掩码 (i = c &amp; 0xFF)。

      【讨论】:

        猜你喜欢
        • 2014-12-04
        • 2017-06-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-21
        • 1970-01-01
        • 1970-01-01
        • 2014-05-18
        相关资源
        最近更新 更多