char ,unsigned char 还有位移 >> <<

本文详细解析了位运算中左移和右移操作的区别,包括算术右移和逻辑右移的不同表现,并通过C语言示例展示了char类型在进行类型转换时的行为特征。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

>> << 对于有符号的用算术运算, 无符号的用逻辑运算。

<< 左移算数逻辑都一样 高位全去掉(符号位也不保留),低位补0.

>>右移有点不同,算术的话高位会补符号位,10000001 >> 2   =11100001

                                 逻辑的话 10000001 >> 2   =01100001

另外 1<<5-1 是1 << (5-1), 逻辑位移优先级低于加减乘除。


char , unsigned char 只有转为int ,unsigned int 这些需要补位的时候才有区别~

#include <stdio.h>
int main(){
	int a,b;
	unsigned n,m;
	unsigned char uc;
	char c;
	uc = 0x7F;
	c = 0x7F;
	a =c;
	b =uc;
	n =c;
	m = uc;
	printf("%x,%x\n",a,b);
	printf("%x,%x\n",n,m);
	return 0;
}
输出是4个7f ,,大家都一样

#include <stdio.h>
int main(){
	int a,b;
	unsigned n,m;
	unsigned char uc;
	char c;
	uc = 0xFF;
	c = 0xFF;
	a =c;
	b =uc;
	n =c;
	m = uc;
	printf("%x,%x\n",a,b);
	printf("%x,%x\n",n,m);
	return 0;
}
输出:

ffffffff,ff

ffffffff,ff

所以说char 补位的时候高位都会填充符号位的值, 即使转化成unsigned的时候也是如此。

而unsigned char 一律补0


Hsm_DF1_Config_Ram.Program_Mac_Value0.b[0]=(unsigned char)(Params->Cmac_type.MacOut[0]&&0x000000FF); Hsm_DF1_Config_Ram.Program_Mac_Value0.b[1]=(unsigned char)((Params->Cmac_type.MacOut[0]&&0x0000FF00)>>8); Hsm_DF1_Config_Ram.Program_Mac_Value0.b[2]=(unsigned char)((Params->Cmac_type.MacOut[0]&&0x00FF0000)>>16); Hsm_DF1_Config_Ram.Program_Mac_Value0.b[3]=(unsigned char)((Params->Cmac_type.MacOut[0]&&0xFF000000)>>24); Hsm_DF1_Config_Ram.Program_Mac_Value0.b[4]=(unsigned char)(Params->Cmac_type.MacOut[1]&&0x000000FF); Hsm_DF1_Config_Ram.Program_Mac_Value0.b[5]=(unsigned char)((Params->Cmac_type.MacOut[1]&&0x0000FF00)>>8); Hsm_DF1_Config_Ram.Program_Mac_Value0.b[6]=(unsigned char)((Params->Cmac_type.MacOut[1]&&0x00FF0000)>>16); Hsm_DF1_Config_Ram.Program_Mac_Value0.b[7]=(unsigned char)((Params->Cmac_type.MacOut[1]&&0xFF000000)>>24); Hsm_DF1_Config_Ram.Program_Mac_Value0.b[8]=(unsigned char)(Params->Cmac_type.MacOut[2]&&0x000000FF); Hsm_DF1_Config_Ram.Program_Mac_Value0.b[9]=(unsigned char)((Params->Cmac_type.MacOut[2]&&0x0000FF00)>>8); Hsm_DF1_Config_Ram.Program_Mac_Value0.b[10]=(unsigned char)((Params->Cmac_type.MacOut[2]&&0x00FF0000)>>16); Hsm_DF1_Config_Ram.Program_Mac_Value0.b[11]=(unsigned char)((Params->Cmac_type.MacOut[2]&&0xFF000000)>>24); Hsm_DF1_Config_Ram.Program_Mac_Value0.b[12]=(unsigned char)(Params->Cmac_type.MacOut[3]&&0x000000FF); Hsm_DF1_Config_Ram.Program_Mac_Value0.b[13]=(unsigned char)((Params->Cmac_type.MacOut[3]&&0x0000FF00)>>8); Hsm_DF1_Config_Ram.Program_Mac_Value0.b[14]=(unsigned char)((Params->Cmac_type.MacOut[3]&&0x00FF0000)>>16); Hsm_DF1_Config_Ram.Program_Mac_Value0.b[15]=(unsigned char)((Params->Cmac_type.MacOut[3]&&0xFF000000)>>24);
06-06
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值