c++字符转换成int多字符常量
c++ char conversion to int multi-character constant
无论如何,你知道怎么做吗?
假设我有
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;
}
- 将转换字符键入 int 以用作向量C++的索引
- 多字符常量警告
- const_cast<字符 *>(字符* 常量) 不是左值?
- 有什么区别 - 常量 int x = 5000;和常量整数 x = 50'00;在C++?
- 将字符串转换为带有Isringstream的字符和INT(组合)
- 如何从方法返回静态常量 int std::array?
- 字符和 int 连接何时会导致 seg 错误?
- 如何在C++中通过命令行参数传递常量 int
- 如果可以将其放在私有中,为什么要使用静态常量(int/string/.)?
- 从字符 * 到 int 的转换无效
- 常量字符数组模板与字符常量* 函数重载
- 了解字符 * 到 int * 的转换及其含义
- 函数中的默认"常量<int>向量 &id"参数
- 带有字符、int 和向量C++的条件
- 如何检查字符常量是否符合ASCII
- 从字符串数组转换为字符* 常量
- C++常量 int 在常量表达式中不可用
- 扫描字符 [] 和 int 时 sscanf 中出现错误
- c++字符转换成int多字符常量
- 当我将sparse_hash_map<字符*常量,int>序列化到文件中时出现问题