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

时间:2016-09-01 09:15:31

标签: c gcc printf

这是我的代码:

#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

什么是问题?

1 个答案:

答案 0 :(得分:5)

这里有两件事情可以发挥作用:

第一个是当你将参数传递给像printf这样的变量参数函数时,它可能是promoted。这里发生的是角色是promoted to an int值。

此处还有其他内容,即签名扩展。如果您将一个小的签名类型(如char似乎在您的系统上)转换为另一个较大的签名类型(如int),如果较小的类型为负,则较大的类型必须相同负数。而且由于two's complement(这是处理二进制系统上负数的最常见方式)的工作原理,该值将被前导二进制数填充。

如果您只想打印char值,则需要使用hh格式前缀"%hhx",如unsigned char中所示。然后,该值将被视为// database.js import config from '../../knexfile'; import knex from 'knex'; import bookshelf from 'bookshelf'; const Bookshelf = bookshelf(knex(config[process.env.NODE_ENV || 'development'])); Bookshelf.plugin('registry'); // Resolve circular dependencies with relations Bookshelf.plugin('visibility'); export default Bookshelf; // Administers.js import Bookshelf from '../database' import { createValidatorPromise as createValidator, required, email as isEmail } from '../../utils/validation'; import { User, Organization } from '../'; import { BasicAdministersView, DetailedAdministersView } from '../../views/index'; class Administers extends Bookshelf.Model { get tableName() { return 'administers'; } get hasTimestamps() { return true; } view(name){ return new ({ basic: BasicAdministersView, detailed: DetailedAdministersView }[name])(this); } user() { console.log(User); return this.belongsTo('User', 'user_id'); } organization() { return this.belongsTo('Organization', 'organization_id'); } } export default Bookshelf.model('Administers', Administers);