c - Long int 到 char : strange output in C

标签 c char long-integer

我有以下字符序列:

    char* input = "3243f6a8885a308d313198a2e0370734";

然后我尝试从 input 中提取前两个字符并将其存储为数字,如下所示:

char state_col[9];
char state_col_t[3];

memcpy(state_col, input, 8);
state_col[8] = 0;
state_col_t[0] = state_col[0]; state_col_t[1] = state_col[1]; state_col_t[2] = 0;
long int value = strtol(state_col_t, &endptr, 16);
char c_value = value;

当我尝试打印出结果时:

printf("%x %x", c_value, value);

我明白了(例如):

32 32

43 43

fffffff6 f6

ffffffa8 a8

这似乎与值 > 0x80 有关。想法?

最佳答案

char 是否有符号是实现定义的,如何将太大的整数转换为有符号整数也是实现定义的。

c_value 应使用unsigned charuint8_t

请注意,您必须将 inttypes.h(或 stdint.h)包含到 uint8_t 中。

顺便说一下,您通过将错误类型的数据传递给 printf() 调用了未定义的行为。以十六进制打印类型为 long int 的数据的正确格式说明符是 %lx

%x 用于 charunsigned charuint8_t 应该没问题,这要归功于整数提升。

关于c - Long int 到 char : strange output in C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38439403/

相关文章:

c# - 将 long/decimal 显式转换为 int

c++ - 长双增量运算符不适用于大数

c - 位移位不正确?

c++ - 如何检测 USB 驱动程序启用/禁用

c++ - 解析定界字符串

c - C 是否提供 API 来以编程方式获取系统上最大可能的并发线程数?

c - 如何在 c 中仅读取此 char 缓冲区中的第二行?

java - isVowel() 方法,用于字符串中的字符

c++ - 加载 OpenSSL API 代码 Apache

c++ - 如何避免公共(public)头文件中#define 的编译时间过长