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\n%d\n",Pava,Kava);// 输出 255 255
(2)b)
char name = 255; unsigned int Pava = name; printf("%d\n",Pava); //输出 -1
(3)
int name = 255; unsigned char Pava = name; printf("%d\n",Pava); // 输出 255
时间: 2024-11-01 03:18:21