如何在C中将多字符常量转换为整数?

时间:2016-03-09 20:56:37

标签: c++ c char

  

如何将x中的多字符常量转换为整数?

我尝试'13'作为('3' + '1' << 3),但它没有正常工作。 我不是"0123",而是'0123'。它编译,但我不知道编译器打印时如何获得八进制结果6014231063。我不是在寻找atoi,只是将其转换为现在的数字。例如int x = '1'将以十进制数字系统打印49。现在我对打印int x = '0123'的内容感兴趣。这项任务来自编程竞赛,所以答案不应该是意外行为。

int main(void) { 
  int x = '0123';  
  printf("%o\n", x);
  printf("%d\n", x >> 24);
  printf("%d\n", x << 8 >> 24);
  printf("%d\n", x & 0xff);  
  return 0;
}

4 个答案:

答案 0 :(得分:6)

  

如何在C中将多字符常量转换为整数?

'0123'中的

int

int x = '0123'; 

'0123'字符常量。在C中,这是常量的一种形式,它的类型为int。它很少使用,因为它的值是实现定义的。它通常取决于字节顺序和字符编码(例如ASCII):

(('0'*256 + '1')*256 + `2`)*256 + '3' = 858927408 = 0x33323130
(('3'*256 + '2')*256 + `1`)*256 + '0' = 808530483 = 0x30313233

此外:用它编写有用的可移植代码是一项挑战。当使用超过1个字符时,许多编码样式都会禁止它。

答案 1 :(得分:4)

'0123'是一个多字符常量/文字(C称它为常量,C ++称之为文字)。在这两种语言中,它的类型为int,并且具有实现定义的值。

'0123'具有值

典型
('0' << 24) + ('1' << 16) + ('2' << 8) + '3'

(假设CHAR_BIT==8,并记住'0'等人的值本身是实现定义的。)

因为该值是实现定义的,所以多字符常量很少有用,并且在可移植代码中几乎无用。该标准甚至不保证'0123''1234'具有不同的值。

但是要回答您的问题,'0123'已经是int类型,因此无需转换。您可以以任何您喜欢的方式存储,操作或打印该值。

例如,在我的系统上这个程序:

#include <stdio.h>
int main(void) {
    printf("0x%x\n", (unsigned int)'0123');
}

打印(在编译时警告之后):

0x30313233

与上面的公式一致 - 但结果可能因另一个实现而有所不同。

“实现定义”值意味着需要实现来记录它。 gcc的行为(对于版本5.3)是documented here

  

预处理器和编译器解释了字符常量   同样的方式;即,例如‘\a’的转义序列被赋予它们的值   将在目标机器上。

     

编译器评估多字符字符常量a   一次一个字符,将前一个值移动数字   每个目标字符的位数,然后输入的位模式   新字符被截断为目标字符的宽度。决赛   位模式的类型为int,因此无论如何都会被签名   单个字符是否已签名(稍有变化)   版本3.1及更早版本的GCC)。如果有更多的字符   常量比在目标int中适合编译器发出的   警告,多余的前导字符将被忽略。

     

例如,对于具有8位'ab'的目标,char将是   解释为
  (int) ((unsigned char) 'a' * 256 + (unsigned char)'b')
和   '\234a'(int) ((unsigned char) '\234' * 256 + (unsigned char) a')

答案 2 :(得分:0)

您可以尝试创建这样的函数:

int StringLiteralToInt(const char* string, int numbeOfCharacters)
{
    int result = 0;
    for(int ch = 0; ch < numberOfCharacters; ch++)
    {
        float powerTen = pow(10, numbeOfCharacters - (ch+1));
        result += (int)string[ch] * (int)powerTen;
    }
    return result;
}

我刚写了内联,所以它可能不是100%正确,但它应该是正确的想法。只需将字符乘以10的幂(最右边 - 10 ^ 0,最左边 - 10 ^(strinSize-1)。

希望有所帮助:)

答案 3 :(得分:0)

嗯,你可以试试这个:

30313233

对我来说,这正如我所期望的那样打印 printf("%o ", (x >> 24) & 0xff); printf("%o ", (x >> 16) & 0xff); printf("%o ", (x >> 8) & 0xff); printf("%o\n", x & 0xff);

在这里它被拆散了,因为它看起来像你想要做的那样:

'0'

这些打印输出表明,在某种意义上,多字符字符常量由字符'1''2''3'123组成。一起。但是这个多字符字符常量与整数 '0'之间没有任何有意义的关系。 (我们可以编写一些代码来移位和屏蔽8位,然后减去atoi以从字符转换为数字,然后乘以10并添加,就像{{1}}一样,但它并不意味着任何东西。)