c++ - 从 size_t 转换为 char 及周围

标签 c++ c++11 casting

我现在正在从 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/

相关文章:

C++ 简单计算器(无 if、Switch、Case 及其种类)

c++ - 一个不同的 CPP 文件如何能够通过定义它来使用另一个文件的功能? C++

c# - 通过反射设置属性值不起作用,而在 C# 中直接设置它可以工作

c# - 迭代对象列表时避免多个 "if"语句 c#

c - 在函数结构上静默 WCast-function-type

c++ - GCC 中的 PRIuPTR 预处理器错误?

c++ win32如何重命名文件夹/目录

c++ - 在 C++11 中按值返回构造对象时避免调用复制构造函数

c++ - vector 中的模板推导失败

C++11 在 Visual Studio 2012 中的委托(delegate)构造函数