0

我记得我们已经了解到有符号整数类型(sbyte、short、int、long)的第一位是符号,后 7 位是值。

我看到 sbyte 范围是 -128 到 127,而我认为它必须是 -127 到 127。

我尝试了一些代码来理解这是怎么可能的,我遇到了两个奇怪的事情:

1-我尝试了以下代码:

sbyte a = -128;
Console.Write(Convert.ToString(a, 2));

结果是

1111111100000000

好像它是一个两字节变量。

2-尝试将范围内的所有数字转换为二进制:

for(sbyte i=-128;i<=127;i++)
{
    Console.WriteLine(Convert.ToString(i, 2));
    if(i==127) break;
}

如果我省略if(i==127) break;循环继续。并且随着中断,循环中的代码不会执行,有些好像 -128 大于 127。

我的结论: 因为我认为 -128 一定不适合无符号字节变量,并且第一次和第二次尝试批准 (111111110000000 > 01111111) 但如果它不适合,那么为什么范围是 -128 到 127?

4

1 回答 1

3

我看到那个sbyte范围是-128to127而我认为它必须是-127to 127

范围[-128, +127]确实如此。范围[-127, +127]意味着sbyte只能表示255不同的值,而 8 位可以256组合。

顺便说一句,如果-128不是合法值,编译器会抱怨

sbyte a = -128;

没有重载Convert.ToString(sbyte value, int toBase),所以在你的情况下Convert.ToString(int value, int toBase)被调用,并sbyte被提升为int.

要快速检查该值,您可以打印sbyte为十六进制数:

sbyte s = -1;
Console.WriteLine("{0:X}", s); // FF, i.e. 11111111

如果我省略if(i==127) break;循环继续。

当然,sbyte.MaxValue127i<=127总是如此true。当iis127和 递增时,会发生溢出,下一个值为-128

于 2016-12-19T02:50:40.223 回答