WGC1 第2章数値表現 2.8飽和
大きいほうの値が小さいオブジェクトの範囲外である場合は、小さいほうの
データ型の範囲内で最大の(または最小の)値にセットするという方法で、大きい値を
切り詰めます。
実験コード
#include <stdlib.h> #include <stdio.h> #include <limits.h> void print(char *info, unsigned short us, short s){ printf("------%s------\n",info); printf("us(hd) = %hd\n", us); printf(" s(hd) = %hd\n", s); printf("us(d) = %d\n", us); printf(" s(d) = %d\n", s); printf("------------\n"); return; } int main(int argc, char *argv[]){ unsigned short us = 0; short s = 0; unsigned int ui = 0; int i = 0; us = (unsigned short)65535; s = (short)32767; print("USHORT MAX,SHORT MAX", us,s); us = (unsigned short)65546; s = (short)32778; print("USHORT MAX + 10,SHORT MAX + 10", us,s); us = (unsigned short)UINT_MAX; s = (short)INT_MAX; print("UINT MAX, INT MAX", us,s); ui = 65535; i = 32767; us = (unsigned short)ui; s = (short)i; print("USHORT MAX,SHORT MAX,CAST", us,s); ui = 65546; i = 32775; us = (unsigned short)ui; s = (short)i; print("USHORT MAX + 10,SHORT MAX + 10,CAST", us,s); ui = UINT_MAX; i = INT_MAX; us = (unsigned short)ui; s = (short)i; print("UINT MAX, INT MAX, CAST", us,s); return 0; }
結果
------USHORT MAX,SHORT MAX------ us(hd) = -1 s(hd) = 32767 us(d) = 65535 s(d) = 32767 ------------ ------USHORT MAX + 10,SHORT MAX + 10------ us(hd) = 10 s(hd) = -32758 us(d) = 10 s(d) = -32758 ------------ ------UINT MAX, INT MAX------ us(hd) = -1 s(hd) = -1 us(d) = 65535 s(d) = -1 ------------ ------USHORT MAX,SHORT MAX,CAST------ us(hd) = -1 s(hd) = 32767 us(d) = 65535 s(d) = 32767 ------------ ------USHORT MAX + 10,SHORT MAX + 10,CAST------ us(hd) = 10 s(hd) = -32761 us(d) = 10 s(d) = -32761 ------------ ------UINT MAX, INT MAX, CAST------ us(hd) = -1 s(hd) = -1 us(d) = 65535 s(d) = -1 ------------
うーむ飽和にはならないな
なにか勘違いしてる??
MMX拡張命令が使われてるかどうかってどうやって確認するんだろ。。。