【问题标题】:Why one char character appears on 4 bytes in C language为什么 C 语言 4 个字节上出现一个 char 字符
【发布时间】:2019-04-12 20:18:52
【问题描述】:

我正在编写 C 代码,我想将某个字符的十六进制值与另一个进行比较。这是可行的,但是对于像 这样的某些值,我在 4 个字节上获得了一个值,这在我的比较中毫无意义。

void obs_text(char* start, unsigned char debugLevel, unsigned char depth){
    printf("%c -> 0x%x\n", start[0], start[0]);
}

我希望输出包含两个十六进制字符,但实际输出是 ? -> 0xffffffef。 请问有人明白会发生什么吗?感谢您的帮助。

我正在用 gcc 编译。

Configured with: --prefix=/Library/Developer/CommandLineTools/usr --with-gxx-include-dir=/Library/Developer/CommandLineTools/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1
Apple LLVM version 10.0.1 (clang-1001.0.46.3)
Target: x86_64-apple-darwin18.2.0
Thread model: posix

但我也尝试在 Debian 操作系统上遇到同样的问题

【问题讨论】:

  • 我们需要更多信息。你能提供调用那个函数的代码吗?
  • 请注意,start[0] 在传递给可变参数函数时会提升为 int。如果您传递的char 是负数,那么int 也将是负数,然后%x 会将其视为无符号值。
  • 尝试printf("%c -> %d\n", start[0], start[0]); 并报告输出。

标签: c


【解决方案1】:

因为%x 表示以十六进制显示为无符号整数(4 个字节)。见http://www.cplusplus.com/reference/cstdio/printf/

如上所述,您可以使用 %hhx(在 C99 中添加)来获得您所期望的行为(在 this answer 中查看更多信息)。

【讨论】:

    【解决方案2】:

    使用%hhx 并将参数转换为unsigned char

    printf( "%c - 0x%hhx", start[0], (unsigned char) start[0] );
    

    %x 期望其对应的参数具有unsigned int 类型。您需要使用hh 长度修饰符来告诉它您正在处理unsigned char 值。

    【讨论】:

    • 注意:(unsigned char) 不需要。 (unsigned char) start[0]start[0] 在调用 printf() 之前都转换为 intprintf()int 转换为 unsinged char 作为 %hhx 说明符的一部分。
    猜你喜欢
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    • 1970-01-01
    • 2018-05-12
    • 1970-01-01
    • 2022-01-07
    • 2012-11-11
    • 2015-04-28
    相关资源
    最近更新 更多