1.当执行一个运算时,如果它的一个运算符是有符号的而另一个是无符号的,
那么C语言会隐式的讲有符号参数强制转换为无符号数,并假设这两个数都是非负的.
这个有可能导致一些问题的发生。摘自<<深入理解计算机系统[p48]>>
举个例子,写一个程序,判断字符串str1长度大于字符串str2,一般的写法是这样的:
if((strlen(str1) - strlen(str2)) > 0)
printf("str1 is longer!/n");
else
printf("str2 is longer!/n");
但是,这个程序永远是输入 str1 is longer!
你知道为什么吗?如果有误,如何修改呢?
2.另外,计算机所用的数字编码形式,绝大部分都是用补码来表示。
举个例子,比如说 int a = 0xffffffff;
转换成二进制则为:[一位变四位,十六进制于二进制的转换]
1111 1111 1111 1111 1111 1111 1111 1111 也就是4个字节,(假定机器是32位的).
那么,如果执行 printf("%d",a); 将输出值为 -1
原因在于补码的计算方法,第一位表示符号位,1为负,0为正.
所以,0xffffffff = -1*232+1*231+1*230+....+1*20 = -1;