我的算法出了什么问题?

tan*_*grs 6 c algorithm math

好吧,我已经编写了一些代码来反转六角形字符作为我组成的有趣练习的一部分.

这就是我现在所拥有的:

#include <stdio.h>  
int main() {  
    char a,b,c;  
    while (1) {  
        c = getchar();  
        if (!feof(stdin)) {  
            a = c % 16;  
            b = (c - a) / 16;  
            c = (a*16) + b;  
            putchar(c);  
        }else{break;}  
    }  
return 0;  
}  
Run Code Online (Sandbox Code Playgroud)

它适用于大多数值.例如,0xA0变为0x0A等...

但是,以"F"开头的值并不能很好地发挥作用.

0xF1变为0x10
0xFF变为0xF0
等...

有人能指出我正确的方向吗?

Nea*_*ter 7

如果在您的系统上签名char,那么当c的高半字节为f时,c为负数,而c%16将给出否定结果.


aka*_*ppa 5

您正在使用已签名(在您的计算机上)数据类型.将其切换为无符号,它应该正常工作.

  • 您已经获得了解决方案,但请注意`char`可以根据实现进行签名或取消签名. (2认同)
  • Tangrs:显然你签名的`char`是8位,因此不能存储像`0xFF`这样的值(或任何大于127 /`0x7F`的值).具有最高位设置的值是负的 - 例如,`0xF0`实际上是-16.您的算法仅适用于正数. (2认同)