二进制数字的绝对值全看最高位,如果是1说明是负数,整数取反码加一,浮点数直接将最高位设为0。可以看到,浮点数根本就不精确,比较大小的时候只能用相减取绝对值门限的办法,而不是用等号。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
union double_union {
double num;
unsigned char bytes[8];
};
typedef union double_union double_union;
int main() {
double_union x[4];
int i;
int m, n;
x[0].num = -0.245942;
x[1].num = -14.4495;
x[2].num = -913247882219.6644758912347;
x[3].num = -999501489501.142;
for(i = 0; i < 4; i++) {
x[i].bytes[7] &= 0x7f;
}
for(i = 0; i < 4; i++) {
printf("%10.4f\n", x[i]);
}
m = -425;
n = -949991347;
if(m & 0x7f000000) {
m = (~m) + 1;
}
if(n & 0x7f000000) {
n = (~n) + 1;
}
printf("M:%d, N:%d\n", m, n);
return(0);
}