-128 如何适合 sbyte
How -128 fits in a sbyte
我记得我们学过有符号整数类型(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?
I saw that sbyte
range is -128
to 127
while I thought it must be -127
to 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 omit the if(i==127) break;
the loop goes on.
当然,sbyte.MaxValue
是 127
,所以 i<=127
总是 true
。当 i
为 127
并递增时,发生溢出,下一个值为 -128
.
我记得我们学过有符号整数类型(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?
I saw that
sbyte
range is-128
to127
while I thought it must be-127
to127
.
范围的确是[-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 omit the
if(i==127) break;
the loop goes on.
当然,sbyte.MaxValue
是 127
,所以 i<=127
总是 true
。当 i
为 127
并递增时,发生溢出,下一个值为 -128
.