【问题标题】:How -128 fits in a sbyte-128 如何适合一个 sbyte
【发布时间】:2017-05-04 01:28:51
【问题描述】:

我记得我们已经学习了有符号整数类型(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;,则循环继续。加上break,循环中的代码不会执行,有些好像-128大于127。

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

【问题讨论】:

  • 我找不到合适的帖子标题
  • 有符号整数类型不是“符号大小”类型。他们使用“2 的补码”表示,符号字节的范围为 -128 到 127。 en.wikipedia.org/wiki/Two's_complement
  • 您算错了“16 位结果”中 1 和 0 的数量。实际值有 9 个 1 和 7 个 0,但在您的问题中,您输入了 8 个 1 和 8 个零。
  • @Aziz 非常感谢。这真的很有趣

标签: c# types sbyte


【解决方案1】:

我看到sbyte 的范围是-128127,而我认为它必须是-127127

范围确实是[-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.MaxValue127,所以 i&lt;=127 始终是 true。当i127 并递增时,发生溢出,下一个值为-128

【讨论】:

  • 我知道 -128 是一个合法值,我想知道它的二进制值是多少。 Aziz 的链接解释了它
  • 您的代码解决了我获取111111110000000 的奇怪值的另一个问题
  • @AshkanMobayenKhiabani 你可以打印为十六进制,我更新了帖子。
猜你喜欢
  • 1970-01-01
  • 2019-05-13
  • 2019-08-07
  • 2014-07-20
  • 2016-06-02
  • 1970-01-01
  • 2016-03-10
  • 2012-06-08
  • 1970-01-01
相关资源
最近更新 更多