【发布时间】:2021-05-28 00:09:43
【问题描述】:
两个补码表示法中以下哪一个表示最大值?
a. 00000010
b. 11111111
c. 00000001
d. 11111110
我发现答案是 A.,即 00000010 但如何?
【问题讨论】:
两个补码表示法中以下哪一个表示最大值?
a. 00000010
b. 11111111
c. 00000001
d. 11111110
我发现答案是 A.,即 00000010 但如何?
【问题讨论】:
所以你有 有符号字节 来比较;这些值在[-128..127] 范围内。现在让我们检查一下:
a. 00000010 == 10 (binary) == 2 <- the largest value (among -2, -1, 1, 2)
b. 11111111 == -1 (binary) == -1
c. 00000001 == 1 (binary) == 1
d. 11111110 == -10 (binary) == -2
注意,如果二进制表示从1 开始,则值为负。
您可以通过2 complement获得这些负数的绝对值:
x => ~x + 1
~ 代表 bitwise not 而+ 1 像往常一样添加1
例如:
11111111 => 00000000 + 1 == 00000001 == 1 (and we have -1)
11111110 => 00000001 + 1 == 00000010 == 2 (and we have -2)
编辑:让我们 implement 一个简单的例程 (C#) 用于一般情况(注意,前导零是 强制):
private static string SignedIntegerValue(string value) {
if (value.StartsWith('0'))
return value;
StringBuilder sb = new StringBuilder(value.Length + 1);
sb.Append('-');
sb.Append(value);
int shift = 1;
for (int i = sb.Length - 1; i >= 1; --i) {
int v = (1 - sb[i] + '0') + shift;
sb[i] = (char)('0' + (v % 2));
shift = v / 2;
}
return sb.ToString();
}
演示:
string[] values = new string[] {
"00000010",
"11111111",
"00000001",
"11111110",
};
string report = string.Join(Environment.NewLine, values
.Select(x => $"{x} => {SignedIntegerValue(x).PadLeft(x.Length + 1)}"));
Console.Write(report);
结果:
00000010 => 00000010
11111111 => -00000001
00000001 => 00000001
11111110 => -00000010
【讨论】: