上下两部分结果不同, 很神奇吧 ?

查阅头文件发现, strlen 返回值 是 size_t 类型的, 就是 usigned long long 类型, 两者做差是不同的.

所以写程序的时候就尽量避免 减法运算, 比如比较 a-5 和 b 的大小
if ( a-5 > b ) 就尽量写成 if ( a > b+5 )
当然, 这是对于无符号类型来说

我们来打破砂锅问到底, 这里就涉及 无符号整数做差的 问题,

计算机内部运算全都是补码运算, 我们来举个例子 50 + 100

50 的二进制补码是:   00000000|00000000|00000000|00110010
100的二进制补码是:  00000000|00000000|00000000|01100100
4294967246的补码是   11111111|11111111|11111111|11001110

50 - 100, 就是 50 + (-100)

50 的二进制补码是:   00000000|00000000|00000000|00110010
100的二进制原码是:  00000000|00000000|00000000|01100100
100的二进制补码是:  11111111|11111111|11111111|10011011

-50的二进制原码是:   11111111|11111111|11111111|10010110     // ‭4294967190‬
-50的二进制补码是:   1111 1111 1111 1111 1111 1111 1100 1110‬     // ‭4294967246‬

ps : 正数补码是原码自身, 负数补码是 取反加一

就是这个原理,

明明 x长度是3, y长度是4, 相减却输出 yes,
就是因为 strlen 返回值是 usigned long long,
3 - 4 -> 3 +(-4)
在计算机运算中 都是补码运算 首尾的 1 并不是代表符号, 而是实际的数, 所以就是一个正数, 所以就输出了 yes

声明:本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。