【问题标题】:c++ char conversion to int multi-character constantc++ char转换为int多字符常量
【发布时间】:2013-01-21 14:38:49
【问题描述】:

你知道怎么做吗?

假设我有

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”。我想这与此有关...我也尝试了 usigned 但没有好的结果。

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

【问题讨论】:

  • 看看here
  • 使用位移位和按位或(以及适当大小的无符号类型)。
  • 万一您在程序中实际使用"(¸þ¶",它会中断,因为最后三个字符是多字节字符。编译器应该发出警告。这个问题涵盖了如何将特殊字符放入字符串文字中:stackoverflow.com/q/2420780/1175253

标签: c++ char int decimal


【解决方案1】:

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

请参阅此问题以了解如何转换位: 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;
}

【讨论】:

  • 我试图将 memcpy 放入 int uint32_t x; memcpy(&x, value, 4);
  • @AlexandruCalin 因为您正在处理内存。如果您想处理 numbers,请使用处理 numbers(位移)的操作。
  • @AlexandruCalin 如果这给您“错误的结果”,请编辑您的问题以说明您期望的结果。
  • @Alexandru Calin:您能否为该字符串中的每个字节添加十六进制值以及您从中获得的整数?看来,您想动态传递 1-4 个字符。为此,您需要某种偏移量。
  • 对不起,我不明白你的意思;你想让我在移位之前将每个字节作为十六进制传递吗?
【解决方案2】:

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

包括所需的标头(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;

}

【讨论】:

  • 这不是关于转换十六进制数字,而是关于获取字符的数字表示。 “A”需要变成 65,而不是 10,“AB”将是 (65*256)+66
猜你喜欢
  • 1970-01-01
  • 2010-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-18
  • 2015-01-29
相关资源
最近更新 更多