我现在正在从 C 过渡到 C++11,我尝试学习更多关于转换的知识。 在这道题的最后,您会看到一个小程序,它要求输入一个数字,然后将其显示为数字和字符。然后将其转换为 char,然后将其转换回 size_t。
当我输入 200 时,第一个 cout 打印 200,但第二个 cout 打印 18446744073709551560。 我如何让它再次打印 200?我用错 Actor 了吗?我已经尝试过不同的类型转换作为动态和重新诠释。
#include<iostream>
using namespace std;
int main(){
size_t value;
cout << "Give a number between 32 and 255: ";
cin >> value;
cout << "unsigned value: " << value << ", as character: `" << static_cast<char>(value) << "\'\n";
char ch = static_cast<char>(value);
cout << "unsigned value: " << static_cast<size_t>(ch) << ", as character: `" << ch << "\'\n";
}
最佳答案
size_t
是无符号的,普通 char
的符号是实现定义的。
将 200
转换为 signed 字符将产生负结果,因为 200 大于 CHAR_MAX
,即 127
对于最常见的情况,一个 8 位字符。 (高级说明 - 此转换也是实现定义的,但出于所有实际目的,您可以假设为负结果;实际上通常是 -56
)。
将 that 负值转换回无符号(但更宽)整数类型将产生相当大的值,因为无符号算术回绕。
您可以先将值转换为 unsigned char
(产生预期的 small 正值),然后转换为更宽的 unsigned 类型.
大多数编译器都有一个开关,可让您将普通 char
切换为 unsigned
,因此您可以对其进行试验。当您开始编写可移植代码时,请尝试编写在两种情况下都能正常工作的代码!
关于c++ - 从 size_t 转换为 char 及周围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25850244/