现在的位置: 首页 > 综合 > 正文

C语言对于 有符号 和 无符号 数字的处理

2013年04月27日 ⁄ 综合 ⁄ 共 586字 ⁄ 字号 评论关闭

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;

 

 

 

 

抱歉!评论已关闭.