有符号整数的表示
每个有符号整数类型可以用三种格式中的任何一种表示; 它是实现定义的,使用哪个。用于任何给定有符号整数类型的实现至少与 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"); }
}
相同的模式适用于较窄类型的表示,但它们无法通过此技术进行测试,因为 &
的操作数在计算结果之前受到通常的算术转换的影响。