无符号整形(size_t)使用时候的注意事项

size_t是标准库中经常会出现的一个关键字,其表示一个无符号整形,在标准库中经常用其来表示大小。比如:  strlen()的返回值就是size_t等等。

无符号整形的使用过程中有一点特别需要注意,就是两个无符号的数据计算的结果还是无符号类型。

 

举个例子:

 我们定义两个size_t类型的数据,

    #include <stddef.h>

    size_t s1 = 1;
    size_t s2 = 2;

 
执行下面这条打印语句:

   printf("%d\n", s1 - s2);       // 打印的结果是-1

 
从上面的打印语句看,好像s1和s2两个无符号数相减也可以存在负数,其实最后打印出-1是因为我们printf指定输出的类型为%d,是一个有符号类型,所以在输出的时候,将他两的结果转换成了有符号类型。

你可以将上面的打印语句换成: 

printf("%u\n", s1 - s2);        // 会发现其会打印一个很大的值,因为对于有符号数而言,上面两数相减结果为-1,其对应二进制最高位和最低位都是1,所以转换为无符号数自然很大。

上面不是一切正常吗? 那你看下面的打印语句

  printf("%d\n", s1-s2 > 0);    // 这行打印语句的输出结果为1,也就说明后面的比较表达式返回的结果是1,也就说明s1-s2的值是大于0的,但是对于有符号数而言它的结果是-1,应该比0小才对。

 printf("%d\n", (int)s1-(int)s2 > 0);  // 比如这样,输出的结果就是0.,因为我们将无符号转换为了有符号的类型。

所以使用size_t和其它的无符号数的时候应该注意: 

其运算结果是一个无符号数,在使用其计算结果与别的的数进行比较的时候,例如:与0比较尤其需要注意这个问题。

那么怎样去避免这个问题呢?

我们可以在使用其运算结果比较的时候,将其转换为有符号的int类型,有些编译器可能会给出警告,但是int和unsigned int的字节数都一样,只会修改正负值不会导致数据截断。

(但是请注意: 对于负数而言,有符号数和无符号数的值可能不仅仅是正负的区别,数值上也是不一样的,比如: 1000 0001 : 有符号数为: -1 ,  无符号数为: 129)

所以:上面所说的问题出现的原因是:   你在声明变量的时候使用的是无符号数,因为这个变量不会为负,但是如果两个无符号数相减,那么小的减去大的。
按照正常的逻辑,肯定是负值,但是对于无符号数并不是这样。如果你在两数相减的时候是按照正常的逻辑来使用,那么就转换成有符号类型,否则就无需转换。

一般情况只需要在使用两值差值进行比较的时候才需要考虑这个问题。

  • 4
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值