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条留言
前一篇:公司成长性和规模无关
后一篇:xxd命令
-->只要几分钟回答问卷,就能轻松赚现金!
©Copyright 麦新杰 Since 2014 云上小悟独立博客版权所有 备案号:苏ICP备14045477号-1。云上小悟网站部分内容来源于网络,转载目的是为了整合信息,收藏学习,服务大家,有些转载内容也难以判断是否有侵权问题,如果侵犯了您的权益,请及时联系站长,我会立即删除。
使用gcc的 -Wextra 参数,应该可以看到关于这个问题的warning。 [ ]