关于算数转换和在库函数strlen()中的应用

文章通过一个C语言代码示例,解释了类型属性的重要性,特别是当涉及到无符号整数时。strlen函数返回的size_t类型是无符号整数,两个无符号整数的运算结果仍为无符号,这导致-1在无符号整数中的表示变为非常大,从而影响运算结果。文章强调了理解数据类型和算数转换在编程中的关键作用。
摘要由CSDN通过智能技术生成

我们知道,一个变量的属性是由两方面构成的,

分别是:类型属性和数值属性

类型属性和数值属性在C语言中都很重要

值得一提的是,我们往往对于数值属性掌握的更加轻车熟路而导致忽略类型属性后所带来的“惨痛代价”

 

举个例子:

对于以下代码:

#include<studio.h>

     int main()

        If(strlen("abc")  -strlen("abcd")<=0)

                     printf(">\n");

        else

                     Printf ("<\n");

        return 0;

   }

             

你是否会认为输出的结果是  “<”

因为你知道,3  -  4 的结果一定是小于等于0的。

确实,-1确实是<0的。

但是我们忽略了一个因素,那就是类型属性。

数值属性上我们知道,3-4结果为-1。

但在类型属性上,-1的类型是 unsigned int,也就是无符号整数。

原因:strlen()库函数的产生的数据类型结果是

size_t :该数据类型是经过 typedef 重新定义名称而来

即:“Typedef unsigned int size_f”

因此,你看到size_t 其实就是看见了 unsigned int

 

我们知道,两个无符号类型的的数进行操作符运算后得到的结果也是无符号类型。

 

因此 “-1”的数值类型为 -1 而数据类型为 unsigned int

一个负数的数据类型一旦是无符号类型的时候,那么

他的数值会变的非常大。

 

原因:

我们知道32位环境中,数据存储是由32位bit进行存储,存入计算机内存的是补码:

-1的二进制序列为:

10000000 00000000 00000000 00000001 

(原码)

经过转换得到补码:

11111111 11111111 11111111 11111111

 

unsigned int 会把转换后得到的补码视为无符号数,也就是最高位不再是符号位,而是数值位。

其结果是  4294967295

因此:输出的结果为:>

 

这就是算数转换或者说,类型属性在C语言中所不可忽略的因素。

不过回归话题,大多数人也并不会像上述方式那样写代码

而是通过使用   大于 小于 这种逻辑操作符去比较大小

当然,举此例是为了强化算数转换和整形提升的知识点。

 

 

 

 

 

 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值