c ++ char转换为int多字符常量

时间:2013-01-21 14:38:50

标签: c++ char int decimal

无论如何都知道如何做到这一点?

让我说我有

char x[] = "ABCD";

我想把它放到一个int中,所以我会有

int y = 'ABCD';

我只能放置个别字符,例如int y = x[0];目的是找到十进制表示,但我想要“ABCD”的十进制表示而不仅仅是“A”。

最后,我将使用sprintf(dest, "%.2u", value);来获取char的十进制表示。

编辑:

我不明白为什么,但对于“ABCD”这段代码可行

//unrolled bit ops
const char* x = "ABCD";
uint32_t y = 0;
y |= (uint32_t(x[0]) << 24); //MSB
y |= (uint32_t(x[1]) << 16);
y |= (uint32_t(x[2]) <<  8);
y |= (uint32_t(x[3]) /*<< 0*/);

然而,每个实例,如果我使用“(¸þ¶”我不会得到相同的结果。

EDIT2 **:

我已经尝试过你的最后一次编辑Sam,但它仍然无效。我得到的值是“4294967294”而不是“683212470”正确的值。 我也做了这个

int h1 = '(';
int h2 = '¸';
int h3 = 'þ';
int h4 = '¶';

输出:

40
-72
-2
-74

我用Google搜索了完整的ascii表,我发现对于“þ”,值为“254”。我想它与此有关...我也尝试过使用但没有好结果。

edit3:如果我用const char *x = "(¸þ¶"替换int x[] = {40, 184, 254, 182};(每个字符的十进制表示,它都有效。我可以理解出错的地方,但我不知道如何修复它。

2 个答案:

答案 0 :(得分:4)

您需要确保该char数组的int对齐以进行正确的转换或对该int执行memcpy。 还要注意整数的字节序!此外,使用C99整数类型(如uint32_t)也有助于使代码可移植。

有关如何转换位的信息,请参阅此问题: strict aliasing and alignment

修改

R. Martinho Fernandes的意思,可能是这个(未经测试):

//unrolled bit ops
const char* x = "ABCD";
uint32_t y = 0;
y |= (uint32_t(uint8_t(x[0])) << 24); //MSB
y |= (uint32_t(uint8_t(x[1])) << 16);
y |= (uint32_t(uint8_t(x[2])) <<  8);
y |= (uint32_t(uint8_t(x[3])) /*<< 0*/);

以上示例避免了任何字节序的特定代码

编辑2:

对于动态字符数组(假设前导零字符,如果必须转换少于4):

const char* x = "ABC";
size_t nChars = 3;

assert(0 < nChars && nChars <= sizeof(uint32_t));

uint32_t y = 0;

int shift = (nChars*8)-8;
for(size_t i = 0;i < nChars;++i)
{
    y |= (uint32_t(uint8_t(x[i])) << shift);
    shift -= 8;
}

答案 1 :(得分:-1)

如果这是你想要的,我已经创建了一个示例程序。

包含所需的头文件(stdio.h,stdlib.h,math.h,string.h)

unsigned long convertToInt(char *x);

void main() {

char x[] = "ABCD";
unsigned long y = 0;

y = convertToInt(x);

printf("Numeric value = %lu\n", y);

}

unsigned long convertToInt(char *x) {

unsigned long num = 0, i, n;`
char hex_c;

for(i = 0; i< strlen(x); i++)  {

    hex_c = x[i];

    if (hex_c >= '0' && hex_c <= '9') {
    n = hex_c - '0';
    } else if (hex_c >= 'A' && hex_c <= 'F') {
    n =  10 + hex_c - 'A';
    } else if (hex_c >= 'a' && hex_c <= 'f') {
    n = 10 + hex_c - 'a';
    } else {
        printf("Wrong input");
    return 0;
    }

    num += n * (pow(16, (strlen(x) - i - 1)));
}

return num;

}