鱼C论坛

 找回密码
 立即注册
查看: 2172|回复: 3

[已解决]为什么结果会不一样?

[复制链接]
发表于 2020-2-12 22:19:36 From FishC Mobile | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
源代码:
#include<stdio.h>

int main()
{
    unsigned short i;
    short j;
   
    i = -1;
    j = -1;
   
    printf("i的值是: %u\n", i);
    printf("j的值是: %u\n", j);
   
    return 0;
}
运行结果:
i的值是: 65535
j的值是: 4294967295

[Process completed - press Enter]

65535我可以理解:我用sizeof运算符测了一下,我的short/unsigned short的长度是2字节,也就是16位。我令i = -1,也就是在unsigned short霸占的坑位里面放了一串这样的二进制数:1111 1111 1111 1111,在格式化输出函数里面我故意把格式化占位符写成%u(以无符号整型来输出),自然就得到了2^16 - 1 = 65535。
但我不知道4294967295怎么来的?费解。
最佳答案
2020-2-12 23:07:17
说实话还真是不知道,查了下资料找到了一个比较合理的说法。
具体printf函数在处理%u的时候是不是如文中所说,还需要查证。

参考:https://blog.51cto.com/781588100/1564128

而printf用%u的格式时 ,若被读的数是unsigned 类型,则不会有 “字符扩张”,若是signed 类型的(char short int long)都会有字符的扩展,而这个扩展在内存中是查看不到的,扩展成四个字节的数据, 具体如下:

    若要读的数据 小于0,在内存中 符号位是1,扩展的时候,不足32位的都要在前面扩展出来的位补1(因为最前面是1,类似于<< >>左移右移时的方法),这个扩展出来的数 再以无符号int型十进制读。例如本例的-1 ,内存中是0xff ,扩展之后的就是0xff ff ff ff  这样再读就是4294967295了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-12 22:55:06 | 显示全部楼层
同问
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-2-12 22:58:57 | 显示全部楼层
-1在内存中的补码为全1,将这个值解释为无符号整型,则为无符号整型所能表示的最大值,32位下为4294967295 转成二进制 就成了 1111 1111 1111 1111 1111 1111 1111 1111
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-2-12 23:07:17 | 显示全部楼层    本楼为最佳答案   
说实话还真是不知道,查了下资料找到了一个比较合理的说法。
具体printf函数在处理%u的时候是不是如文中所说,还需要查证。

参考:https://blog.51cto.com/781588100/1564128

而printf用%u的格式时 ,若被读的数是unsigned 类型,则不会有 “字符扩张”,若是signed 类型的(char short int long)都会有字符的扩展,而这个扩展在内存中是查看不到的,扩展成四个字节的数据, 具体如下:

    若要读的数据 小于0,在内存中 符号位是1,扩展的时候,不足32位的都要在前面扩展出来的位补1(因为最前面是1,类似于<< >>左移右移时的方法),这个扩展出来的数 再以无符号int型十进制读。例如本例的-1 ,内存中是0xff ,扩展之后的就是0xff ff ff ff  这样再读就是4294967295了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 05:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表