首页 » 信息技术 »

当有无符号数参与运算的时候...

2020年12月5日 / 11次阅读
CC++

遇到一个坑,当无符号数参与运算的时候,结果默认也是无符号数,除非是给有符号数赋值。

仔细阅读下面的测试代码:

#include <stdio.h>

void main()
{
    unsigned int a,b;
    a = 1;
    b = 2;
    printf("%d %u\n",a-b,a-b);
    if (a-b > 0)
        printf("you can see this...\n");

    int c,d;
    c = 3;
    d = 1;
    printf("%d %u\n", a-c, a-d);
    if (a-c > 0)
        printf("you can see this too...\n");
    if (d-b > 0)
        printf("you can see this again...\n");

    int e,f;
    e = 5;
    f = 6;
    if (e-f > 0)
        printf("you can not see this!!!\n");

    int g = -1;
    if (a > g)
        printf("no see again...!!!\n");

    if (e > g)
        printf("see it!\n");

}

在以上的各种 if 判断中,凡是有无符号数参与的时候,结果默认都是无符号数;计算得到负数,会被当成一个很大的正数来处理;与有符号数进行比较,有符号数也成了无符号的。要特别小心。。。这种情况,把代码写成 a>b ,a>c 等形式更好,避免产生超大的无符号数,导致程序崩溃!

而在全都是有符号数的情况下,结果默认按有符号数进行处理,有符号数用起来更自然,但很多时候无符号数更能够表达准确的含义。

出现这种情况的原因,其实是因为数字在计算机中,是以补码的形式存储的。C很底层,会直接用补码去计算,编译器会检查type,以确定计算结果是以有符号还是无符号的方式处理。

C语言这种强类型的语言,其实就是在处理内存,type与内存直接相关,不同的type就有不同的内存大小,有时不同type内存大小相同,但表达的含义不同。

本文链接:https://www.maixj.net/ict/unsigned-24176

相关文章

留言区

《当有无符号数参与运算的时候...》有1条留言

  • 麦新杰

    使用gcc的 -Wextra 参数,应该可以看到关于这个问题的warning。 []


前一篇:
后一篇:
-->只要几分钟回答问卷,就能轻松赚现金!

栏目精选

云上小悟,麦新杰的独立博客

Ctrl+D 收藏本页

栏目


©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号:苏ICP备14045477号-1。云上小悟网站部分内容来源于网络,转载目的是为了整合信息,收藏学习,服务大家,有些转载内容也难以判断是否有侵权问题,如果侵犯了您的权益,请及时联系站长,我会立即删除。

go to top