如果可以接受精度损失,饱和操作(Saturation)也是一种缩短整数值位数的方法。对一个值进行饱和转换,只需将位数较多的对象的低位复制到位数较少的对象中。如果位数较多的对象的值超出位数较少的对象的表示范围,则要对位数较多的值进行裁剪(Clip),将位数较少的对象设置为其范围内的最大(或最小)值。
例如,在将16位带符号整数转换为8位带符号整数时,如果16位整数值在-128~127之间,只需将低位字节复制到8位对象中就完成了转换。如果16位带符号整数的值大于+127,则将其裁剪为+127,并将+127存储到8位对象中。同样,如果该值小于-128,最终8位对象将被裁剪为-128。裁剪32位值的饱和转换也是一样的方法。
如果位数较多的值超出了位数较少的值的表示范围,则饱和转换会损失精度。尽管值被裁剪也不好,但有时这种方式好过抛出异常或其他拒绝计算的方式。对于许多应用程序(例如音频或视频)来说,裁剪后的结果对于最终用户仍然是可识别的,因此这是一种合理的转换方式。
许多CPU通过特殊的“多媒体扩展”指令集支持饱和操作算法,比如英特尔80x86处理器系列的MMX/SSE/AVX扩展指令。大多数CPU标准指令集及大多数高级语言都没有直接支持饱和操作,但实现起来也并不难。下面这段 Free Pascal/Delphi代码实现的就是将32位整数转换为16位整数的饱和操作: