-10用16进制输出为何为ffffff6

#include <stdio.h>
int main()
{
    short int x = -10;
    // 原码 - 1000 0000 0000 1010
    // 反码 - 1111 1111 1111 0101
    // 补码 - 1111 1111 1111 0110
    //         F    F    F    6(我以为的结果)
    // 结果 - fffffff6, 好像占用4个字节
    printf("%x\n", x);
}

刚开始看C语言,不太明白
求解,谢谢诸位

阅读 5k
3 个回答

printf("%x", n) 的打印结果 ff ff ff f6,去判定参数 n 的长度为 4 字节,是错误的。

根据 C 语言规范,printf 函数的 x 修饰符在没有指定长度时,默认转换成 unsigned int 类型。
即在本例中 printf("%x", n) 等同于 printf("%x", (unsigned int)n)

要将参数 n 按原数据类型打印,可以这样

printf("%hx", n);
// 或
printf("%x", (unsigned short)n);

参考
[1] C printf, http://www.cplusplus.com/refe...

语言标准只规定了类型至少几个字节,以及几种类型之间的大小关系。
类型具体占多大由编译器决定。


李毅的回答是对的。你没用正确的%x修饰符输出,导致其实是按unsigned int输出的。
如果你改对了输出的修饰符之后,结果还是不符合预期,则可以用我上面的回答解释。

#include <stdio.h>

int main(void) { 
    
    char a=-10,b=1,e=2,d=4;
    long long c=-10;
    int sizea=sizeof(a);
    int sizec=sizeof(c);
    printf("%x,%d\n%x,%d\n",a,sizea,c,sizec);
    printf("%x,%d\n%x,%d",*((unsigned int*)&a),sizea,*((unsigned int*)&c),sizec);
    return 0;
}
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进