为什么整数在溢出时会有不同的行为

时间:2015-05-08 22:30:31

标签: c integer unsigned signed

我正在阅读的c编程书(c编程,现代方法第2版)说,当在无符号整数的操作期间发生“溢出时,结果已定义。”

这是一个小代码示例

JBWatchActivityIndicator
然后他说“对于有符号的整数,这些整数的行为没有被定义”。这意味着程序可以打印出错误的结果,也可能导致程序崩溃。

为什么会这样?

1 个答案:

答案 0 :(得分:3)

归结为硬件表示,并且存在多种方式来表示二进制(符号幅度,补码,二进制补码)中的有符号整数类型以及对它们的操作。当发生溢出时(例如触发硬件陷阱,使用模数等),它们具有完全不同的含义。

在二进制中表示无符号整数值并对这些值执行数值运算的所有明显方法都具有相同的结果 - 基本上硬件中的数值运算使用模运算。

对于基本类型(和其他东西),当存在多种可行的实现方式时,标准通常允许编译器供应商自由,并且这些选项具有不同的结果。有符号整数类型的方法有多种,使用每种方法的实际硬件有多种方式。它们的不同足以保证行为未定义(因为该术语在标准中定义)。