c++字符转换成int多字符常量

c++ char conversion to int multi-character constant

本文关键字:字符常量 int 字符 转换 c++      更新时间:2023-10-16

无论如何,你知道怎么做吗?

假设我有

char x[] = "ABCD";

我想把它放入int类型,所以我有

int y = 'ABCD';

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

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

编辑:

我不明白为什么,但是对于"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

我搜索了完整的ascii表,我发现对于"þ"的值是"254"。我想这和这个有关……我也试过用ussigned,但没有好的结果。

edit3:如果我将const char *x = "(¸þ¶"替换为int x[] = {40, 184, 254, 182};(每个字符的十进制表示),它可以工作。我知道哪里出了问题,但我不知道如何解决。

您需要确保该char数组的整型对齐,以便进行正确的强制转换或对该整型进行内存调用。还要注意整数的端序!此外,使用C99整数类型,如uint32_t,也将有助于使你的代码可移植。

看这个问题如何转换位:严格混叠和对齐

编辑:

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:

对于动态字符数组(假设前导0字符小于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;
}

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

包含所需的头文件(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 = %lun", 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;
}