黑马程序员技术交流社区

标题: 求大神指点,谢谢了 [打印本页]

作者: 子城伯涵    时间: 2014-5-22 09:06
标题: 求大神指点,谢谢了
本帖最后由 子城伯涵 于 2014-5-22 10:43 编辑

为什么signed类型,输出时为unsigned类型不会报错,两个类型之间可以相互转换。为负数的时候转换的原理是什么。
#include<stdio.h>
int main()
{
    unsigned int a=-10;
    signed int b=-10;
    printf("%u\n",b);
    return 0;
}
作者: 戒惜舍得    时间: 2014-5-22 10:20
  1. #include<stdio.h>
  2. void putBinary(int);
  3. int main()
  4. {
  5.     unsigned int a=-10;
  6.     signed int b = -10;
  7.     putBinary( b);
  8.         printf("%u\n",b);
  9.     putBinary(b);
  10.     return 0;
  11. }
  12. void putBinary(int n)
  13. {
  14.     int bits = sizeof(n) * 8;
  15.     while (bits-->0) {
  16.         printf("%d", n>>bits&1);
  17.         if (bits%4==0) printf(" ");
  18.         }
  19.     printf("\n");
  20. }
复制代码


   楼主 可以 看看  实际上  这个   变量 b  的值是没有变的
    当  你 printf("%d\n", b); 时   最高位的  1  是 符号位 代表  符号  
1111 1111 1111 1111 1111 1111 1111 0110
是 变量 b 是 负十 在内存中的表现形式
   当你  printf("%u\n", b); 时       最高位 不是符号位  代表  2的31次方  实际值 是 2147483648
2147483648  在内存中是
1000 0000 0000 0000 0000 0000 0000 0000
2147483648  再减一 就是  2147483647  在内存中是
0111 1111 1111 1111 1111 1111 1111 1111   这样存储的
2147483647  减 9 的值在内存中的表现形式是
0111 1111 1111 1111 1111 1111 1111 0110  这个值 是  2147483638

2147483638 + 2147483648   = 4294967286  

所以  4294967286  在 内存中 是   下面的表现形式
1111 1111 1111 1111 1111 1111 1111 0110
下图是  上面的代码的 执行结果


Snip20140522_7.png (21.67 KB, 下载次数: 37)

Snip20140522_7.png

作者: 子城伯涵    时间: 2014-5-22 10:40
戒惜舍得 发表于 2014-5-22 10:20
楼主 可以 看看  实际上  这个   变量 b  的值是没有变的
    当  你 printf("%d\n", b); 时   最高位 ...

大神威武,谢谢了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2