带有printf()的c中的十六进制unicode

بار*_*ابا 2 c printf gcc

这是我的代码:

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

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

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

./main 1
31
Run Code Online (Sandbox Code Playgroud)

注意:31是十六进制代码1

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

./main $(printf "\Udbb1")
ffffffed
Run Code Online (Sandbox Code Playgroud)

有什么问题?

Som*_*ude 5

这里有两件事:

第一个是当你将参数传递给变量参数函数时,就像printf它可能被提升一样.这里发生的是角色被提升为一个int值.

而这里还有其他的东西,即符号扩展.如果将一个小的有符号类型(如同char在您的系统上)转换为另一个较大的有符号类型(如int),如果较小的类型为负数,则较大的类型必须是相同的负数.并且由于二进制补码(这是处理二进制系统上的负数最常见)的方式,所以该值将被前导二进制填充.

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