代码文件:

shiyan8.c

wget http://121.43.169.106:5244/p/Halo/shiyan8.c?sign=VmiX29K4UzSuAjhvAWqlYjZ0pIAEUOfbn1GGgy63jbg=:0 -O shiyan8.c
gcc shiyan8.c -o shiyan8

源码:

#include <stdio.h>
#include <limits.h>
int absVal(int x)
{
    int sign = (x >> ((sizeof(int) << 3) - 1));
    return (x ^ sign) + (sign & 1);
}
int addOK(int x, int y)
{
    int sum = x + y;
    return (((x >> ((sizeof(int) << 3) - 1)) ^ (y >> ((sizeof(int) << 3) - 1))) & 1) | ((~((x >> ((sizeof(int) << 3) - 1)) ^ (sum >> ((sizeof(int) << 3) - 1)))) & 1);
}
int conditional(int x, int y, int z)
{
    return z ^ ((y ^ z) & (!x + ~0));
}
unsigned float_abs(unsigned f)
{
    unsigned exp = f >> 23 & 0xff;
    unsigned frac = f & 0x7fffff;
    int x = (!(~(exp | 0xffffff00))) & (!!frac);//当exp为0xff且frac不为0时为1,以保留符号位
    return ((x << ((sizeof(unsigned) << 3) - 1)) | 0x7fffffff) & f;
}
int main()
{    
    printf("absVal test:\n");
    printf("absVal(-5)=%d\n", absVal(-5));
    printf("absVal(12)=%d\n", absVal(12));

    printf("addOK test:\n");
    printf("addOK(0x80000000,0x80000000)=%d\n", addOK(0x80000000, 0x80000000));
    printf("addOK(0x80000000,0x70000000)=%d\n", addOK(0x80000000, 0x70000000));

    printf("conditional test\n");
    printf("conditional(2,4,5)=%d\n", conditional(2, 4, 5));
    printf("conditional(0,4,5)=%d\n", conditional(0, 4, 5));

    printf("float_abs test:\n");
    printf("float_abs(0x42c88000)=%8x\n", float_abs(0x42c88000));
    printf("float_abs(0xc1c90000)=%8x\n", float_abs(0xc1c90000));
    printf("float_abs(0xffff0000)=%8x\n", float_abs(0xffff0000));

    return 0;
}