显然,您必须处理的是一个未知类型的数据字节。
为了在有符号尾数中写入一个数字(请参阅Significand),人们会期望您处理浮点类型,例如单精度或双精度。但是,您只有一个字节。
single 是 8 个字节,所以肯定不可能这样,而 double 是双重麻烦。 half 也需要 16 位。唯一合乎逻辑的替代类型是SByte,但在这种情况下,您将永远不会得到任何小数点后有尾数(有效数字)的数字。实际上没有小数。所以也许这是一个技巧问题?
如果你继续假设 SByte,你会得到 -6x10^0
以防万一您需要证明,或者如果您好奇调试期间的外观:
private void SByte2Dec()
{
sbyte convertsHexToSByte = Convert.ToSByte("0xFA", 16);
Single yourAnswer = Convert.ToSingle(convertsHexToSByte);
label1.Text = Convert.ToString(youranswer);
}
在这个例子中,我有一个 Windows 窗体,上面只有 label1。
然后我把 SByte2Dec();在 InitializeComponent() 下;
从答案向后工作,很容易看到您的教授做了什么。他假设 MSB 是符号位,其余的被视为 7 位整数。这有一个先例,称为“Signed Magnitude Representation”,但它并未用于现代计算。这些天来,几乎每个人都在使用Two's compliment。
我认为这是一门初学者课程,而不是费尽心思解释二进制的恭维和数据类型,您的教授主要是想把 MSB 作为符号位的观点带回家。如果您掌握了整个符号位并且对现代计算机硬件执行计算的方式一无所知,那么您可能会得出相同的答案。
我的猜测是,你的教授还用一种奇怪的方式来表达这个问题,以便在你尝试用谷歌搜索答案时让你偏离正轨。如果你想让他回来,问他“1000 0000”和“000 0000”有什么区别。此外,如果您或班上的其他任何人回答 -6 并且他算错了,他应该被解雇。那些自学了两个人的恭维的学生应该获得奖励积分。
- 为什么带符号的尾数是-6?我看到 2 的补码是 -6 但有符号尾数不同?
我读过“Significand”上的wiki article I linked to 吗?
要意识到的重要一点是“有符号尾数”不是一种数据类型。然而,在 IEEE 标准被广泛采用之前,有(曾经?)许多不同的特定于机器的数据类型实现了它们自己的存储浮点数的版本。这些早期的数据类型通常被称为 DFP 或十进制浮点数,而不是二进制浮点数。阅读this paper 以获得更深入的了解。 this paper 也很好地涵盖了这个主题。
正如我之前所说,如果您在互联网上搜索答案,您的教授很可能会使用术语“签名尾数”来让您失望。显然,您应该在字里行间阅读并知道他真正要求的是一种十进制浮点形式,或Signed Magnitude Representation。
“签名尾数”≠二人恭维
“有符号尾数”将被解释为某种形式的十进制浮点数
其中,Two's Compliment 是 Binary Floating Point
的一种形式