static_cast 用于将 int 转换为 char

static_cast use to convert int to char

我写了这段代码来将十进制转换为二进制:

string Solution::findDigitsInBinary(int A) {
if(A == 0 )
    return "0" ;
else
{
string bin = "";
while(A > 0)
{
    int rem = (A % 2);
    bin.push_back(static_cast<char>(A % 2));
    A = A/2 ;
}    
reverse(bin.begin(),bin.end()) ;
return bin ;
}
}

但是使用 static_cast 没有得到想要的结果。

我看到了与此相关的东西,它给出了预期的结果:

(char)('0'+ rem).

static_cast有什么区别?为什么我没有得到正确的二进制输出?

与:

(char) '0' + rem;

重要的区别不在于转换,而是将总是结果为 0 或 1 的余数添加到字符“0”,这意味着您添加字符“0”或“1”到你的字符串。

在您的版本中,您要添加 0 或 1 的整数表示,但 0 和 1 的字符串表示为 48 或 49。通过将 0 或 1 的余数添加到“0”,它会给出一个值48(字符 0)或 49(字符 1)。

如果您在代码中做同样的事情,它也会起作用。

string findDigitsInBinary(int A) {
    if (A == 0)
        return "0";
    else
    {
        string bin = "";
        while (A > 0)
        {
            int rem = (A % 2);
            bin.push_back(static_cast<char>(A % 2 + '0')); // Remainder + '0'
            A = A / 2;
        }
        reverse(bin.begin(), bin.end());
        return bin;
    }

基本上您应该向字符串中添加字符,而不是数字。所以你不应该在字符串中添加 0 和 1,你应该添加数字 48(字符 0)和 49(字符 1)。

这张图表可能会更好地说明。看到字符 value/digit '0' 是十进制的 48 了吗?假设您想将数字 4 添加到字符串中,那么因为十进制 48 为 0,那么您实际上想要将 52 的十进制值添加到字符串中,即 48 + 4。这就是 '0' + rem做。如果您插入一个字符,这会自动为您完成,也就是说,如果您这样做:

mystring += 'A';

它会在您的字符串中添加一个 'A' 字符,但实际上它所做的是将 'A' 转换为十进制 65 并将其添加到字符串中。您在代码中添加的是小数 numbers/integers 0 和 1,这些不是 Unicode/ASCII 表示中的字符。

现在您了解了字符的编码方式,将整数转换为 char 不会将 decimal/integer 更改为其字符表示形式,但会将数据类型从 int 更改为 char,一个 4 字节的数据类型(最有可能)为 1 字节数据类型。您的演员表执行了以下操作:

在模 % 运算之后,您得到的结果是整数 1 或 0,假设您得到余数 1,它看起来像一个整数:

00000000 00000000 00000000 00000001

转换为 char 后,它会将其转换为 one-byte 数据类型,这将使​​它看起来像这样:

00000001 // Now it's a one-byte data type

而编码为字符串字符的“1”数字看起来像 49,看起来像这样:

00110000

至于 static_cast 和 c-style 转换之间的区别,static_cast 会根据特定规则 compile-time 检查并允许某些类型之间的转换,而 c-style演员表没有那么严格。

char a = 5;
int* p = static_cast<int*>(&a); // Will not compile
int* p2 = (int*)&a; // Will compile and run, but is discouraged as there are risks.
*p2 = 7; // You've written past the single byte char into 3 extra bytes, which is an access violation, or undefined behaviour.