这是我的代码:
#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
注意:31
是1
但是当使用Unicode
参数运行时,请打印4Byte
十六进制:
./main $(printf "\Udbb1")
ffffffed
什么是问题?
答案 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);
。