深圳优化网站排名,网站域名过期怎么做,济南微网站开发,凡科网网站建设size_t是标准库中经常会出现的一个关键字#xff0c;其表示一个无符号整形#xff0c;在标准库中经常用其来表示大小。比如: strlen()的返回值就是size_t等等。 无符号整形的使用过程中有一点特别需要注意#xff0c;就是两个无符号的数据计算的结果还是无符号类型。 举个例…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) 所以上面所说的问题出现的原因是 你在声明变量的时候使用的是无符号数因为这个变量不会为负但是如果两个无符号数相减那么小的减去大的。 按照正常的逻辑肯定是负值但是对于无符号数并不是这样。如果你在两数相减的时候是按照正常的逻辑来使用那么就转换成有符号类型否则就无需转换。一般情况只需要在使用两值差值进行比较的时候才需要考虑这个问题。