为什么转换int - > hex / oct / bin打印为输出中的纯十进制值?

时间:2016-01-30 12:41:06

标签: c++ stringstream

#include <iostream>
#include <sstream>

using namespace std;

int main() {
     // <variables>
     int t = 0b11011101;

     stringstream aa;

     int n;
     string hexed;
     int hexedNot;
     // </variables>

     aa << t;
     aa >> n;
     cout << n << endl; // output 221
     aa.clear();

     aa << hex << n;
     aa >> hexed;
     aa.clear();

     aa << hex << n;
     aa >> hexedNot;
     cout << hexed << endl; // output dd

     cout << hexedNot; // output 221

     return 2137;
}

我想使用stringstream将int小数转换为hex / oct / bin整数,但我不知道如何正确处理它。如果我尝试将其转换为包含十六进制的字符串,那很好,但是当我尝试用整数做同样的事情时,它就不起作用了。有任何想法吗?我不能使用c ++ 11,我希望以一种非常简单的方式来实现它。

我知道我可以使用cout << hex << something;,但这只会改变我的输出,并且不会将渐变的值写入我的变量。

2 个答案:

答案 0 :(得分:1)

std::string hexed;读取了std::stream,您在向流注入n的十六进制表示后阅读了该文件:

 aa << hex << n;

下一步操作

 aa >> hexed;

从流中读取std::string变量。因此

cout << hexed << endl; // output dd

你似乎有一个很大的误解:

  

我知道我可以使用cout << hex << something;,但这只会改变我的输出并且它不会写 hexified < / strong> 值到我的变量

在c ++或任何其他编程语言中,没有像&#34; hexified value&#34; 这样的东西。只有(整数)

整数是整数,它们在输入/输出中的表示是一个不同的鱼:

它没有直接绑定到它们的变量类型或它们初始化的表示形式,而是指示std::istream / std::ostream要做什么。

要在终端上打印221的十六进制表示,只需写入

即可
cout << hex << hexedNot;

至于你的评论:

  

但我希望有一个变量int X = 0xDD或int X = 0b11011101(如果可能的话)。如果没有,我将继续使用cout&lt;&lt; hex&lt;&lt;某事物;就像我一直有的那样。

当然这些都是可能的。你应该尝试

,而不是坚持他们的文字表示
int hexValue = 0xDD;
int binValue = 0b11011101;
if(hexValue == binValue) {
    cout << "Wow, 0xDD and 0b11011101 represent the same int value!" << endl;
}

答案 1 :(得分:0)

不要混淆presentation and content

整数(与所有其他值一样)在计算机内存中存储为二进制(“内容”)。 cout是以二进制,十六进制还是十进制打印,只是格式化事物(“表示”)。 0b110111010xdd221只是相同号码的表示

C ++或我所知的任何其他语言都不会存储带有整数变量的格式信息。但是你可以随时创建自己的类型:

// The type of std::dec, std::hex, std::oct:
using FormattingType = std::ios_base&(&)(std::ios_base&);

class IntWithRepresentation {
public:
  IntWithRepresentation(int value, FormattingType formatting)
  : value(value), formatting(formatting) {}

  int value;
  FormattingType formatting;
};

// Overload std::cout <<
std::ostream& operator<<(std::ostream& output_stream, IntWithRepresentation const& i) {
  output_stream << i.formatting << i.value;
  return output_stream;
}

int main() {
  IntWithRepresentation dec = {221, std::dec};
  IntWithRepresentation hex = {0xdd, std::hex};
  IntWithRepresentation oct = {221, std::oct};

  std::cout << dec << std::endl;
  std::cout << hex << std::endl;
  std::cout << oct << std::endl;
}