unsigned 和 signed

http://www.cnblogs.com/stonehat/archive/2011/10/14/2212141.html

http://m.blog.csdn.net/blog/u010086298/37777607

先看两个例子

#include <stdio.h>
int main(int argc, char *argv[])
{
    unsigned char a = -1;
    char b = a;
    printf("%d  %d",a,b);

    return 0;
}
//结果:255  -1
#include <stdio.h>
int main(int argc, char *argv[])
{
    unsigned short a = -1;
    short b = a;
    printf("%d  %d",a,b);

    return 0;
}
//结果:65535  -1

 在计算机中,负数是以补码来存储的。 

      C语言中常量整数 -1的补码表示为0xFFFFFFFF。截取后面16位FFFF赋值给 变量a(unsigned short)。此时 a = 0xFFFF(a没有符号位,0xFFFF转换为十进制为65535)。

      a又将0xFFFF,直接赋值给short b。 此时 b = 0xFFFF(但是要注意,b是有符号的,0xFFFF转换为十进制为-1)。

执行printf("%d %d",a,b);的时候,要将 a和b的值先转换为int型:

 a没有符号所以转为int型为0x0000FFFF,

 b有符号转换为int型为0xFFFFFFFF。

十进制输出值 65535  -1. 

#include <stdio.h>
int main(int argc, char *argv[])
{
    
    unsigned int a = -1;
    int b = a;
    printf("%d  %d",a,b);

    return 0;
}
//结果 -1 -1

a在内存中值为0xFFFFFFFF,b的值为0xFFFFFFFF,都已经32位,

a转换为int型的时候就是0xFFFFFFFF,所以输出-1.

规则整理

(1)如果转换前后位数相同,那么其实位本身并没有发生变化,变化的只是对位的解释(符号位)如unsigned int a = -1 int b=a 

(2)如果位数变长了, 需要填充,分两种情况。a) unsigned 转换为signed,则填充0, b)signed 转换为unsigned,填充位与符号位相同

(3)如果位数变短了,则直接截断

规则(1)不多说

规则(2)a)由下面的例子验证

//定义了一个有符号的变量
unsigned char  name = 255;
int Pava = name;
//定义了一个短整型,
short Kava = name;
printf("%d
%d
",Pava,Kava);
// 输出 255 255

(2)b)

char  name = 255;
unsigned int Pava = name;
printf("%d
",Pava);
//输出 -1

(3)

int  name = 255;
unsigned char Pava = name;
printf("%d
",Pava);
// 输出 255
原文地址:https://www.cnblogs.com/yxzfscg/p/4783199.html