对于这个任务,我只能使用基本的按位运算符和没有控制结构,所以我已经拿出这个代码到目前为止将符号大小转换为two's complement。从符号幅度转换为二进制补码
int sm2tc(int x) {
// Invert and add 1
// Problem: sm has 2 zeros.. 1000...000 & 0000...000
int tmin = 1 << 31;
int mask = x >> 31; // Determine sign of x
int mask2 = ~tmin; // Negate tmin to get 0111111...
int first = (x^mask) + (~mask + 1) ;
int second = first & mask2; // Turns of MSB
return second;
}
我哪里出错了?
你不应该依赖32位的int。使用'int32_t'确定('stdint.h')。 – 2011-09-23 20:10:36
该代码正在32位Linux机器上运行,用于评分和在我的机器上运行。如果我希望这是可移植的,我想我可以使用(sizeof(int)* CHAR_BIT - 1)来存储位值。 – tippenein
如果练习的目的是为了具有良好定义的位操作并对位进行签名,你应该使用无符号类型。 –