有符号整数的表示

每个有符号整数类型可以用三种格式中的任何一种表示; 它是实现定义的,使用哪个。用于任何给定有符号整数类型的实现至少与 int 一样宽,可以在运行时从该类型中值 -1 的表示的两个最低位来确定,如下所示:

enum { sign_magnitude = 1, ones_compl = 2, twos_compl = 3, };
#define SIGN_REP(T) ((T)-1 & (T)3)

switch (SIGN_REP(long)) {
   case sign_magnitude: { /* do something */ break; }
   case ones_compl:     { /* do otherwise */ break; }
   case twos_compl:     { /* do yet else  */ break; }
   case 0:  { _Static_assert(SIGN_REP(long), "bogus sign representation"); }
}

相同的模式适用于较窄类型的表示,但它们无法通过此技术进行测试,因为 & 的操作数在计算结果之前受到通常的算术转换的影响。