2016-12-06 101 views
1

由于标题假设我试图将十六进制数字(如0x320000dd)转换为十进制数字。 我的代码仅适用于正数,但在表示负数的十六进制数字时会失败。这里是我的代码片段:在十进制数字中正确转换十六进制数字(也是负数)

  cin>>hex>> x; 
     unsigned int number = x; 
     int r = number & 0xffffff; 

我的输入是十六进制的alreay,并且计算机自动将它转换为整数。我想要做的是获得十六进制数的操作数,所以最后24位。 你能帮我让我的代码工作负值:0x32fffdc9或0x32ffffff?非常感谢!

编辑:

,我想我的输出是: 0x32fffdc9 - > -567 或 0x32ffffff - > -1

所以只是普通的十进制值,而是它给了我16776649和16777215为上面的例子。

+1

@kiner_shah十六进制最可能是std :: hex。 – Borgleader

+0

@Borgleader,明白了! :-) –

+0

哦,我很抱歉,我错过了告诉你,我包括'使用名称空间标准;'在我的代码中。所以std :: hex不会改变任何东西,对吧? :) – Jennan

回答

1

负整数通常存储在2's complement这意味着如果未设置最高有效位(MSB),则该数不为负数。这意味着,就像您需要取消设置您的号码的8个MSB以将32位数字设置为24位正数一样,所以您需要设置您的号码的8个MSB来钳位负数:

const int32_t r = 0x800000 & number ? 0xFF000000 | number : number & 0xFFFFFF; 

vector<bool>bitset可能是值得你考虑,因为他们将澄清十六进制数位的范围内进行设置。

+0

谢谢你的回答,我不完全理解它,因为英文不是我的母语,而且我使用的是旧版C++编程,它不允许我使用int32_t,但是你所说的是获取MSB在0x32ffffff的情况下会是第2个后面的第一个f,对吧?如果它是8或更高,则表示负数。我理解正确吗? 另外,在我知道它是否为否定之后,我不能只在价值的前面加一个' - ',对吧?我需要计算差异是否正确? – Jennan

+0

@Jennan 1)如果你的编译器不能处理'int32_t',你应该在使用标准容器时放置更多的值2)是的,我说24位整数的MSB将定义它是否为负3)否,你不能简单地否定24位整数来得到它的负表示,'-'执行2的补码操作,并且你不希望你的24位整数被修改,所以你需要这样做面具。 –

+0

非常感谢! – Jennan

相关问题