signed int与usigned int转换(有符号变量与无符号变量)

  • 数据存储方式
    • 计算机中数据都是以二进制进行存储的  正数为原码形式,负数为二进制补码形式
    • 假定以字长为两个字节的机器为例int a=7
    • signed int a=7    存储方式:0000 0000 0000 0111
    • signed int a=-7   存储方式: 1111 1111 1111 1001
    • unsigned int a=7 存储方式:0000 0000 0000 0111
    • -1是最大的负整数,转换成正整数也是最大的
  • 实例代码
    •  1 #include <stdio.h>  
       2   
       3 char getChar (int x,int y)  
       4 {  
       5     char c;   
       6     unsigned int a = x;  
       7   
       8     (a+y > 10) ? (c = 1): (c = 2);  
       9   
      10     return c;  
      11 }   
      12   
      13 int main (void)  
      14 {  
      15     char c1 = getChar(7,4);  
      16     char c2 = getChar(7,-7);  
      17     char c3 = getChar(7,-8);  
      18     char c4 = getChar(-6,7);  
      19       
      20     printf("c1 = %d\n",c1);  
      21     printf("c2 = %d\n",c2);  
      22     printf("c3 = %d\n",c3);  
      23     printf("c4 = %d\n",c4);  
      24       
      25     return 0;  
      26 }  

      运行结果:c1=1,c2=2,c3=2,c4=1;

    • 当表达式中同时存在有符号类型与无符号类型时,所有的操作数都将自动转换成无符号类型
      •   c3分析
      • y将自动转换成无符号类型
      • y=-7在计算机中的存储为1111 1111 1111 1001    a=7存储为0000 0000 0000 0111
      • a+y=0000 0000 0000 0000  溢出  所以值为0
      • c4分析
      • y=-8存储为 1111 1111 1111 0111     a=7存储为0000 0000 0000 0111
      • a+y=1111 1111 1111 1111  即最大的整数   肯定大于10  所以c4=1;
posted @ 2018-12-20 09:27  long_ago  阅读(2191)  评论(0编辑  收藏  举报