如何将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;
}
答案 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}}一样,但它并不意味着任何东西。)