C语言中的强制类型转换与机组的联系

199 阅读2分钟

@[TOC]

测试代码块

void main(){
	// 1
	short x=-4321; 			//short型占用2个字节
	unsigned short y=(unsigned short)x;
	
	// 2
	int a=165537, b=-34991; 		//int型占用4个字节
	short c=(short)a, d=(short)b; 	//short型占用2个字节
	
	// 3
	short x=-4321;
	int m=x;
	unsigned short n=(unsigned short)x;
	unsigned int p=n; 
}

研究与结论

代码1:

在代码1 中: x:1110 1111 0001 1111 真值-4321 强制转化为无符号时变成: y:1110 1111 0001 1111 真值61215

结论1:

无符号数与有符号数: 不改变数据内容,改变解释方式。

代码2:

int型占用4个字节 将int类型强制转化为short时: short型占用2个字节

a b c d 结果:

a:0x000286a1 	真值165537
c:0x86a1 		真值-31071
b:0xffff7751	真值-34991
d:0x7751 		真值30545

在这里插入图片描述

结论2:

长整数变短整数: 高位截断,保留低位。

代码3:

short x转化为int m ,因为 C 语言中定点整数是用“补码”存储的,所以前面补1。 在这里插入图片描述 short x转化为 无符号 n 真值发生改变 在这里插入图片描述 unsigned short n 转化成 unsigned int p ,无符号前面补0。 在这里插入图片描述

x:1110 1111 0001 1111
	16进制:0xef1f
m:1111 1111 1111 1111 1110 1111 0001 1111
	16进制:0xffffef1f 真值-4321
n:1110 1111 0001 1111 
	16进制:0xef1f 真值61215
p:0000 0000 0000 0000 1110 1111 0001 1111
	16进制:0x0000ef1f 真值61215

结论3:

短整数变长整数: 符号扩展。