<分区>
令a
为有符号整数类型T
的变量,U
为相应的无符号类型。表达式 (U)a
产生的值对应于 a
的值的二进制补码表示形式为 U
。我想知道 C 标准是否保证以下内容可以撤消该转换。是U
类型的u
并且具有(U)a
的值。是 MAX
类型 T
可以容纳的最大值。 (请注意到无符号类型的隐式转换,以及这些转换后带符号变量的每个正值都保持不变的事实。)
首先,假设T
能够保存结果:
T convert_2scomplement_to_T(U n) {
return n<=MAX ? n : -(T)(U)-n;
}
其次,假设函数应该检测到这样一个无效参数;是 MIN
T
可以容纳的最小值:
T convert_2scomplement_to_T_checked(U n) {
if(n <= MAX) return n;
if( !(n & (U)1 << sizeof(U)*CHAR_BIT-1) ) { // (*)
// invalid argument, the value is positive and `T' cannot hold it
}
/* `n' represents something negative if we're here. */
if(-n < MIN) {
// invalid argument, the value is negative and `T' cannot hold it
}
return -(T)(U)-n;
}
据我所知,标有//(*)
的行并不严格符合标准,因为标准不对符号位的位置做出任何保证。
所描述的功能是否按预期工作?在严格符合的代码中是否可以避免对符号位的检查?
(除了语言律师的事情……如果编写过代码的人知道至少有一个人在不使用二进制补码的平台上使用过它,并且可以发表评论,这是什么机器,那就太好了。 Wikipedia 提及
有符号的幅度:
补语:
- https://en.wikipedia.org/wiki/PDP-1
- https://en.wikipedia.org/wiki/CDC_160_series
- https://en.wikipedia.org/wiki/UNIVAC_1100/2200_series
但这在今天编写的程序中似乎没有什么可担心的。标准仍然适用于此类机器是否有原因?)