A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 子城伯涵 中级黑马   /  2014-5-22 09:06  /  1230 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 子城伯涵 于 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;
}

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

2 个回复

倒序浏览
  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, 下载次数: 8)

Snip20140522_7.png

评分

参与人数 1技术分 +1 收起 理由
傘が咲く + 1

查看全部评分

回复 使用道具 举报 1 0
戒惜舍得 发表于 2014-5-22 10:20
楼主 可以 看看  实际上  这个   变量 b  的值是没有变的
    当  你 printf("%d\n", b); 时   最高位 ...

大神威武,谢谢了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马