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

发布于 2022-09-07 16:00:25 字数 309 浏览 34 评论 0

#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语言,不太明白
求解,谢谢诸位

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

俏︾媚 2022-09-14 16:00:26

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


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

情绪少女 2022-09-14 16:00:26
#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;
}
不气馁 2022-09-14 16:00:25

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...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文