与:
(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)。
此图表可能会更好地说明。看看字符值/数字“0”如何是十进制的 48?假设您想将数字 4 添加到字符串中,然后因为十进制 48 是 0,那么您实际上想要将 52 的十进制值添加到字符串 48 + 4。这就是 '0' + rem做。如果您插入一个字符,这会自动为您完成,也就是说,如果您这样做:
mystring += 'A';
它会在您的字符串中添加一个“A”字符,但实际上它实际上是将“A”转换为十进制 65 并将其添加到字符串中。您在代码中添加的是十进制数字/整数 0 和 1,这些不是 Unicode/ASCII 表示中的字符。
现在您了解了字符的编码方式,将整数转换为 char 不会将小数/整数更改为其字符表示,但会将数据类型从 int 更改为 char,即 4 字节数据类型(大多数可能)到一个 1 字节的数据类型。你的演员做了以下事情:
在模 % 运算之后,你得到一个整数 1 或 0 的结果,假设你得到一个余数 1,它看起来像一个 int:
00000000 00000000 00000000 00000001
在转换为 char 之后,它会将其转换为单字节数据类型,这将使它看起来像这样:
00000001 // Now it's a one-byte data type
而“1”数字编码为字符串字符的样子是 49,看起来像这样:
00110000
至于 static_cast 和 c-style cast 之间的区别,static_cast 进行编译时检查并允许基于特定规则在某些类型之间进行强制转换,而 c-style cast 没有那么严格。
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.