我们知道,一个变量的属性是由两方面构成的,
分别是:类型属性和数值属性
类型属性和数值属性在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语言中所不可忽略的因素。
不过回归话题,大多数人也并不会像上述方式那样写代码
而是通过使用 大于 小于 这种逻辑操作符去比较大小
当然,举此例是为了强化算数转换和整形提升的知识点。