鱼C论坛

 找回密码
 立即注册
查看: 2861|回复: 5

[已解决]关于两个无符号整形相减结果能否为负

[复制链接]
发表于 2019-11-14 13:54:17 | 显示全部楼层 |阅读模式
10鱼币
#include <stdio.h>
#include <string.h>

int main()
{
        char str1[] = "love";
        char str2[] = "FishC";

        if (strlen(str1) - strlen(str2) < 0)
        {
                printf("字符串%s比字符串%s短!\n", str1, str2);
        }
        else
        {
                printf("字符串%s比字符串%s长!\n", str1, str2);
        }

        return 0;
}//此时输出结果为strlen(str1) - strlen(str2) > 0,输出else语句,但将strlen(str1) - strlen(str2)单列出来时有如下情况

#include <stdio.h>
#include <string.h>

int main()
{
        char str1[] = "love";
        char str2[] = "FishC";

        printf("%d",strlen(str1) - strlen(str2) );
}//此时运行结果为-1,不明白为什么两个的结果会相反。
最佳答案
2019-11-14 13:54:18

首先你要搞清楚,不论是有符号还是无符号数相加减,cpu都是用其补码做加法运算(cpu只有加法器)。4-5就是4+(-5),4的补码是0x00000004,-5的补码是0xFFFFFFFB,这个数相加等于0xFFFFFFFF。于是呢,打印%d就是把0xFFFFFFFF当作带符号数进行打印,相当于-2^31+2^30+2^5+...2^0=-1。同理打印%u时当作无符号则:2^31+2^30+2^5+...2^0=4294967295。
以上,我觉得说到这里应该都能看懂了,如果还没看懂得话,建议好好复习一下小甲鱼的教程。
QQ截图20191114135154.png

最佳答案

查看完整内容

首先你要搞清楚,不论是有符号还是无符号数相加减,cpu都是用其补码做加法运算(cpu只有加法器)。4-5就是4+(-5),4的补码是0x00000004,-5的补码是0xFFFFFFFB,这个数相加等于0xFFFFFFFF。于是呢,打印%d就是把0xFFFFFFFF当作带符号数进行打印,相当于-2^31+2^30+2^5+...2^0=-1。同理打印%u时当作无符号则:2^31+2^30+2^5+...2^0=4294967295。 以上,我觉得说到这里应该都能看懂了,如果还没看懂得话,建议好好复习一下小甲 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-14 13:54:18 | 显示全部楼层    本楼为最佳答案   

首先你要搞清楚,不论是有符号还是无符号数相加减,cpu都是用其补码做加法运算(cpu只有加法器)。4-5就是4+(-5),4的补码是0x00000004,-5的补码是0xFFFFFFFB,这个数相加等于0xFFFFFFFF。于是呢,打印%d就是把0xFFFFFFFF当作带符号数进行打印,相当于-2^31+2^30+2^5+...2^0=-1。同理打印%u时当作无符号则:2^31+2^30+2^5+...2^0=4294967295。
以上,我觉得说到这里应该都能看懂了,如果还没看懂得话,建议好好复习一下小甲鱼的教程。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-14 16:08:09 From FishC Mobile | 显示全部楼层
strlen确实返回的是无符号数,既然你知道这一点,就不该用它做减法来比较大小,这样你大于0的条件就是恒成立了的。至于你为何会得到负数……你用%d打印出来的是带符号的,FFFFFFFF(假设是x86)算上符号位就是-1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2019-11-14 21:25:46 | 显示全部楼层
printf("%u",strlen(str1) - strlen(str2) );

printf("%d",(int)(strlen(str1) - strlen(str2)));

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-14 21:39:56 | 显示全部楼层
EushullyChan 发表于 2019-11-14 16:08
strlen确实返回的是无符号数,既然你知道这一点,就不该用它做减法来比较大小,这样你大于0的条件就是恒成 ...

#include <stdio.h>
#include <string.h>

int main()
{
        char str1[] = "love";
        char str2[] = "FishC";


        printf("%u",strlen(str1) - strlen(str2) );
}//此时结果虽然为正数,但结果很大,为什么会这样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-11-14 21:40:27 | 显示全部楼层
micolar 发表于 2019-11-14 21:25
printf("%u",strlen(str1) - strlen(str2) );

printf("%d",(int)(strlen(str1) - strlen(str2)));

#include <stdio.h>
#include <string.h>

int main()
{
        char str1[] = "love";
        char str2[] = "FishC";


        printf("%u",strlen(str1) - strlen(str2) );
}//此时结果虽然为正数,但结果很大,为什么会这样?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-10-4 21:18

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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