我正在查看以下代码来测试十六进制数字并将其转换为整数.代码有点聪明,因为它利用大写字母和低位字母之间的差异是32,而那是第5位.所以代码执行一个额外的OR,但保存一个JMP和两个CMPs.
static const int BIT_FIVE = (1 << 5);
static const char str[] = "0123456789ABCDEFabcdef";
for (unsigned int i = 0; i < COUNTOF(str); i++)
{
int digit, ch = str[i];
if (ch >= '0' && ch <= '9')
digit = ch - '0';
else if ((ch |= BIT_FIVE) >= 'a' && ch <= 'f')
digit = ch - 'a' + 10;
...
}
Run Code Online (Sandbox Code Playgroud)
C和C++是否保证[af]和[AF]字符的ASCII或值?这里,保证意味着上下字符集总是相差一个常数值,可以用一个位表示(对于上面的技巧).如果没有,标准对他们说了什么?
(对不起C和C++标签.我对两种语言在这个问题上的立场感兴趣).
有人可以解释为什么这有效吗?
char c = '9';
int x = (int)(c - '0');
Run Code Online (Sandbox Code Playgroud)
为什么从char的ascii代码中减去'0'会导致char表示的数字?
我试图了解它是如何putchar('0' + r);工作的.下面,该函数采用整数并将其转换为二进制.
void to_binary(unsigned long n)
{
int r;
r = n % 2;
if (n >= 2)
to_binary(n / 2);
putchar('0' + r);
}
Run Code Online (Sandbox Code Playgroud)
我谷歌putchar的定义,但我没有找到这个.为了测试它,我添加了一个printf来查看r的值:
void to_binary(unsigned long n)
{
int r;
r = n % 2;
if (n >= 2)
to_binary(n / 2);
printf("r = %d and putchar printed ", r);
putchar('0' + r);
printf("\n");
}
Run Code Online (Sandbox Code Playgroud)
然后我运行它(键入5)并获得此输出:
r = 1并且putchar打印1
r = 0并且putchar打印0
r = 1并且putchar打印1
所以我认为putchar('0' + r); 如果r = 0 …
从这里开始的讨论开始,标准是否为字符指定了值?那么,'0'保证是48?这就是ASCII告诉我们的,但它有保证吗?如果没有,你看到任何编译器'0'不是48?
我有一个char数组,所有数组都是数字,但Char类型意味着:
myArray = ['5','6','8','9','10',....]
Run Code Online (Sandbox Code Playgroud)
例如,我想添加其中两个.我必须将它们转换为整数,然后将它们添加到一起,但使用:
(int)myArray[1]+(int)myArray[2]
Run Code Online (Sandbox Code Playgroud)
给出错误的答案.这样做的功能或正确方法是什么?