【问题标题】:Hexadecimal unicode in c with printf()c中的十六进制unicode与printf()
【发布时间】:2017-01-09 02:20:44
【问题描述】:

这是我的代码:

#include <stdlib.h>
#include <stdio.h>

int main(int argc,char **argv){
    printf("%x\n",*argv[1]);
    return 1;
}

编译 (gcc -o main main.c) 后,我运行它并没有问题:

./main 1
31

注意:311 的十六进制代码

但是当使用Unicode参数运行它时,打印十六进制的4Byte

./main $(printf "\Udbb1")
ffffffed

什么问题?

【问题讨论】:

  • %x 表示 int,但您传递的是 char 值。
  • 如果您希望它打印dbb1,那么您将在阅读有关 Unicode 编码和(很可能)UTF-8 的有趣时光。大多数现代计算机上的单个char 将无法容纳0xdbb1,因为它通常只有 8 位宽。

标签: c gcc printf


【解决方案1】:

这里有两件事在起作用:

首先,当您将参数传递给像printf 这样的变量参数函数时,它可能是promoted。这里发生的是字符是promoted to an int 值。

这里还有另一件事,即符号扩展。如果您将一个小的有符号类型(如char 似乎在您的系统上)转换为另一个较大的有符号类型(如int),如果较小的类型是负数,那么较大的类型必须是相同的负数。由于two's complement(在二进制系统上处理负数最常见)的工作方式,该值将被前导二进制值填充。

如果您只想打印char 值,您需要使用printf 格式前缀hh,如"%hhx"。然后该值将被视为unsigned char

【讨论】:

    猜你喜欢
    • 2015-12-09
    • 2021-04-10
    • 2013-01-21
    • 1970-01-01
    • 2016-09-04
    • 1970-01-01
    • 2011-06-01
    • 1970-01-01
    相关资源
    最近更新 更多