计算机系统基础:实验8
代码文件:
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;
}
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 FwillraWebSite
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果
Steam卡片