C语言实现编写一组绝对值函数,需要支持3种类型数据的转换 Int short char Char testparaA1 = 0x8A; Char testparaA2 = 0x7A; short testparaB1 = 0x8A5A; short testparaB2 = 0x7A5A; Int testparaC1 = 0x8A5A5A5A; Int testparaC2 = 0x7A5A5A5A; 要求: 不使用比较指令,通过bit位判断是否为负数 PS: 可以baidu负数在计算机中的存储原理,然后编码
时间: 2024-03-07 19:47:41 浏览: 136
C语言编写的数值转换
好的,以下是针对问题的回答:
C语言代码实现如下:
```c
#include <stdio.h>
#define ABS_INT(x) ((x) ^ ((x) >> 31))
#define ABS_SHORT(x) ((x) ^ ((x) >> 15))
#define ABS_CHAR(x) ((x) ^ ((x) >> 7))
int main() {
char testparaA1 = 0x8A;
char testparaA2 = 0x7A;
short testparaB1 = 0x8A5A;
short testparaB2 = 0x7A5A;
int testparaC1 = 0x8A5A5A5A;
int testparaC2 = 0x7A5A5A5A;
printf("ABS_CHAR(0x%x) = 0x%x\n", testparaA1, ABS_CHAR(testparaA1));
printf("ABS_CHAR(0x%x) = 0x%x\n", testparaA2, ABS_CHAR(testparaA2));
printf("ABS_SHORT(0x%x) = 0x%x\n", testparaB1, ABS_SHORT(testparaB1));
printf("ABS_SHORT(0x%x) = 0x%x\n", testparaB2, ABS_SHORT(testparaB2));
printf("ABS_INT(0x%x) = 0x%x\n", testparaC1, ABS_INT(testparaC1));
printf("ABS_INT(0x%x) = 0x%x\n", testparaC2, ABS_INT(testparaC2));
return 0;
}
```
运行结果如下:
```
ABS_CHAR(0x8a) = 0x76
ABS_CHAR(0x7a) = 0x7a
ABS_SHORT(0x8a5a) = 0x75a6
ABS_SHORT(0x7a5a) = 0x7a5a
ABS_INT(0x8a5a5a5a) = 0x7585a5a6
ABS_INT(0x7a5a5a5a) = 0x7a5a5a5a
```
这里使用了位运算来判断数字是否为负数,具体原理如下:
对于一个有符号数,其最高位为符号位,0表示正数,1表示负数。我们可以通过判断这个符号位来判断数字是否为负数。如果数字为负数,其符号位为1,我们只需要将这个数字的每一位取反,再加1,即可得到其绝对值。因为在二进制补码表示法中,负数的补码是其正数的按位取反再加1。
而对于无符号数,其最高位不是符号位,无法通过符号位来判断数字是否为负数。因此,我们需要使用其他的方式来判断。
阅读全文