我目前正在阅读一本关于C#编程的书,其中简要介绍了Overflow和Underflow,并且作者大致讲述了当您超出特定类型的允许范围时会发生什么。
例如:
短整型只有从-32768到32767的范围,在书中作者给出的解释是:“对于整数类型(byte、short、int和long),最高位(溢出的位)会被丢弃。这特别奇怪,因为计算机会将其解释为环绕。这就是为什么我们在示例中得到了负值的原因。如果你使用某个特定类型的最大值(例如
这样,你会得到最小值(-32768)。
我不太理解这个问题,当作者谈论“计算机将其解释为环绕”时,我感到困惑。
我试图理解这个问题,短整型使用2个字节(16位)
所以数字32767=0111111111111111 如果我把二进制字符串+1,我就会得到 32768=1000000000000000(不能用短整型表示,因为最大值是32767),所以编译器会给出-32768。为什么会变成负数?
我理解使用二进制补码表示负数的概念,但是否有人能更正我的想法或详细说明一下?我不完全理解为什么我们只使用15位的16位来表示正值,而使用最高位来表示负值。
例如:
short a = 30000;
short b = 30000;
short sum = (short)(a + b); // Explicitly cast back into short
Console.WriteLine(sum); // This would output the value -5536
短整型只有从-32768到32767的范围,在书中作者给出的解释是:“对于整数类型(byte、short、int和long),最高位(溢出的位)会被丢弃。这特别奇怪,因为计算机会将其解释为环绕。这就是为什么我们在示例中得到了负值的原因。如果你使用某个特定类型的最大值(例如
short.MaxValue
)并加上一,你可以轻松地看到这种情况发生。”(《C#玩家指南第二版》,第9章,第58页)这样,你会得到最小值(-32768)。
我不太理解这个问题,当作者谈论“计算机将其解释为环绕”时,我感到困惑。
我试图理解这个问题,短整型使用2个字节(16位)
所以数字32767=0111111111111111 如果我把二进制字符串+1,我就会得到 32768=1000000000000000(不能用短整型表示,因为最大值是32767),所以编译器会给出-32768。为什么会变成负数?
我理解使用二进制补码表示负数的概念,但是否有人能更正我的想法或详细说明一下?我不完全理解为什么我们只使用15位的16位来表示正值,而使用最高位来表示负值。