C++字符和 int 之间的转换,结果错误
C++ conversion between char and int with wrong result
我想在 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
。
相关文章:
- 为什么在逗号分隔符上下文中将预增量的结果强制转换为void
- 尝试将字符串/字符转换为整数会产生意外结果
- Static_cast转换为错误的数据类型,但结果仍然正确?
- 是否可以将无符号 int 的最大值转换为 int 并将结果转换为 -1?
- 使用 sprintf 和 %g 将双精度转换为字符串的意外结果
- 字符到int8_t转换会产生意想不到的结果?
- 将字符串强制转换为GUID并不能得到正确的结果
- 转换为标准时,Clang和GCC中的不同结果::可选<T>
- 如何将 xt::sum 表达式结果转换为整数
- 将函数的地址转换为UINTPTR_T给我不正确的结果
- std::reduce 似乎将结果转换为整数
- 硬编码字符串与强制转换为 PUCHAR 并打印到控制台时从控制台读取的字符串的结果不同
- 为什么在 C# 中将 ushort 端口号从 hton 转换为 ntohs 会给出不同的结果
- time_t提高日期转换,给出不正确的结果
- 将词法强制转换双倍提升为字符串,给出无效结果
- 尝试将二进制数组转换为十六进制C++然后打印结果
- RapidJSON 在转换为字符串时产生不一致的结果
- 非常量表达式的左值到右值转换的结果是常数吗?
- 为什么隐式类型转换在此代码中结果不正确
- 在转换3D矢量时,为什么GLM给出错误的结果