嗯,我来敲敲黑板。
上方讨论的是溢出,就是数据类型长度有限,当数值大到一定程度造成位数不够用的现象。
首先引经据典,C标准说过,(下面的“标准”是个名词,指C语言的规范,请大家脑补,给这个词拟人化一下)
无符号整数的溢出(请注意,首先是溢出)结果是确定的,我就不多说了;
有符号整数的溢出是未定义行为。这个就是标准自己的局限了(某种意义上)或者说正是标准不受局限的地方(在某'种意义上)。
那么,标准为什么这样说呢?因为标准的野心是想要C语言能运行在一切硬件平台上。
某些设计思路比较清奇的硬件平台可能会使用比较清奇的方式表达有符号整数溢出这件事,标准说我容忍你的清奇,我不表态(这就是未定义行为这个词在这个知识点上的含义)。
但是(某位腕儿说过,其实但是之前都是废话),
由于小F我见识有限,只见过不那么清奇的硬件,所以
一般情况下有符号整数的溢出结果也是可预期的。
它和无符号整数一样,最大值再加一会变成最小值。
也就是说signed char类型最大表示127,再走一步就变成-128。
一般的signed short如果是16位,它表示的最大就是32767,再前进就是-32768。
也就是说,在眼前常见的硬件上,占用n位二进制位的有符号整数,它能表示的最大值是2的n-1次方减1,再加1造成溢出,会
绕回到负的2的n-1次方。
所以,溢出是一个定义性术语,绕回是一个描述性词汇,它俩不会对撞什么的。
那么最后,
需要使用有符号整数的时候使用有符号整数
需要使用无符号整数的时候使用无符号整数
无所谓的时候无所谓