C++字符和 int 之间的转换,结果错误

C++ conversion between char and int with wrong result

本文关键字:转换 结果 错误 之间 字符 int C++      更新时间:2023-10-16

我想在 C++ 中在 char 和 int 之间进行转换,但我发现 char 到 int 的转换存在问题。

我用两个数字做了一个测试,103 和 155。 103 在字符中给我"g",155 给我"ø",两者都是正确的,但问题是当我尝试将字符恢复为 int 时:"g"给我 103(正确),但我不知道为什么"ø"给我 -101。

我正在使用 char 变量来存储数字,并使用"prinf("%d", char[x]);"来显示数字。

我有这个测试脚本:

#include <cstdlib>
#include <cstdio>
using namespace std;
int numero = 26523;    
char *inttochar(int number) {
    char *salida;
    for (int j=0;j<=5;j++) {
        salida[5-j] = number % 256;
        printf("%d = %d = %c = %c = %dn", 5-j, number % 256, number % 256, salida[5-j], salida[5-j]);
        number = number / 256;
    }
    return salida;
}
int main(int argc, char** argv) {
    char *texto = inttochar(numero);
    for (int j=0;j<=5;j++) {
        printf("%d: ", j+1);
        printf("%c = %dn", texto[j], texto[j]);
    }
    return 0;
}

结果是:

5 = 155 = ø = ø = -101
4 = 103 = g = g = 103
3 = 0 =   =   = 0
2 = 0 =   =   = 0
1 = 0 =   =   = 0
0 = 0 =   =   = 0
1:   = 0
2:   = 0
3:   = 0
4:   = 0
5: g = 103
6: ø = -101

使用此脚本,我想将一个数字转换为以 256 为基数的字符。 ¿我做错了什么?.

谢谢!,我很抱歉我的英语。

字符是介于 -128 和 127 之间的有符号值(在大多数系统上)。您正在转换该范围之外的内容;转换为 char 会截断,但位模式正常。 转换另一个方向会让你回到这个范围,而 155 不是它的一部分。155 的位模式0x9b;要转换为有符号值,您需要反转位并添加一个,因此它变为 -0x65,即十进制中的 -101。

您可以使用去除扩展符号位的and来修复它:salida[5-j] & 0xff .

编辑:如注释中所述,您的salida变量旨在成为字符串,但您从未为其分配任何存储空间。

char *salida = new char[6];

char在您的平台上似乎是有符号的类型。 这意味着155不适合它。 你得到的155被解释为2的补码符号数字,等于-101