Long int 到 char:C 中的奇怪输出
Long int to char: strange output in C
我有以下字符序列:
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
是否有符号是实现定义的,如何将太大的整数转换为有符号整数也是实现定义的。
您应该使用 unsigned char
或 uint8_t
作为 c_value
。
请注意,您必须将 inttypes.h
(或 stdint.h
)添加到 uint8_t
。
顺便说一句,您通过将错误类型的数据传递给 printf()
来调用 未定义的行为 。以十六进制打印类型为 long int
的数据的正确格式说明符是 %lx
.
对 char
、unsigned char
或 uint8_t
使用 %x
应该没问题,感谢整数提升。
我有以下字符序列:
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
是否有符号是实现定义的,如何将太大的整数转换为有符号整数也是实现定义的。
您应该使用 unsigned char
或 uint8_t
作为 c_value
。
请注意,您必须将 inttypes.h
(或 stdint.h
)添加到 uint8_t
。
顺便说一句,您通过将错误类型的数据传递给 printf()
来调用 未定义的行为 。以十六进制打印类型为 long int
的数据的正确格式说明符是 %lx
.
对 char
、unsigned char
或 uint8_t
使用 %x
应该没问题,感谢整数提升。