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;
本文探讨了C语言中进行运算时有符号与无符号数的隐式转换可能导致的问题,并通过实例说明了如何避免此类错误。此外,还介绍了计算机内部使用补码表示数值的方法及其在实际编程中的应用。
753

被折叠的 条评论
为什么被折叠?



