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.
我写了这段代码来将十进制转换为二进制:
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.