char类型与int类型的相互转换、有无符号数的赋值

本文详细解析了C++中char与int类型之间的转换过程,包括有符号与无符号数的赋值规则,以及负数赋值给无符号类型时的行为。通过具体的代码示例展示了不同数据类型间的转换机制。

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

char类型与int类型的相互转换、有无符号数的赋值

相关知识:

1.计算机中的一个unsigned char型数据表示0~255,而一个signed char型数据表示-128~+127,都是256的数字。这256个数字,在计算机的存储单元都是由0x00~0xFF表示的。

2.这256个数字相同的部分是0~+127,都用0x00~0x7F表示存储。而0x80~0xFF即可以表示+128~+255,也可以表示-128~ -1。当为unsigned char 时,0x80表示为+128~+255;当为signed char时则表示为-128~ -1。

3.计算机中的负数以二进制补码表示,补码 = 二进制数(原码)的反码 + 1

4.正数的补码与原码相同

一、长字节数据类型转为短字节数据类型(发生截断)

int main()
{
	int i = 230;
	char c = i;
	unsigned char uc = i;
	printf("%x\t%d\n",c,c);      //ffffffe6   -26
	printf("%x\t%d\n", uc, uc);  //e6          230
	return 0;
}

十进制230转为二进制表示为11100110,前面的0先不考虑,因为将它转化成为char类型,发生截断,会截取后8个字节,又因为char为有符号数,所以系统在判断11100110时,因为首位为1所以判定为负数,当使用printf打印该数据时,又会将该数据转为int进行扩充,因为第一位是1 所以前面需要补1,所以就是24个1加11100110,又因为负数在内存中是以补码的形式存储,所以求该数据打印结果需要转换,进行-1再取反,得到10000000 00000000 00000000 00011010,除符号位之外为26,再结合前面的符号位为1,所以打印出的数据为-26,但有个问题还存在疑惑,一个是赋值给char截断后的数按照十六进制打印出来,为什么还会打印出这么多位?不应该只有俩位嘛?

二、短字节数据类型转换为长字节数据类型

char转换为int:在前面的三个字节补符号位

如果char的首位为1是负数,则补上0xffffff

如果char的首位为0时正数,则补上0x000000

从unsigned char转换为int,则前面补上0x000000.

三、将负数赋值给无符号数

int main()
{
	unsigned int i = -1;
	unsigned short s = -1;
	unsigned char c = -1;

	cout << "i=" << i << endl;  //4294967295
	cout << "s=" << s << endl;  //65535
	cout << "c=" << c << endl;  //   (为空)
}

负数在内存中以补码形式表示,所以-1原码为10000000  00000000  00000000  00000001求其补码则为11111111  11111111  11111111  11111111,此为转换为4字节的形式,当它给无符号赋值的时候,读取后就为2^32那么大的数了,对应2字节则为2^16大的数,但是还有一个疑问,为什么赋值给unsigned char后打印出来为空?

其他:

所谓有无符号的数 他们在位数上相同,如long 和DWORD 同样是32位 只是在第一位会不相同,有符号位的第一位是符号位 

int: 4byte =  32 bit
有符号signed范围:2^31-1 ~ -2^31 即:2147483647 ~ -2147483648
无符号unsigned范围:2^32-1 ~ 0   即:4294967295 ~ 0

long: 4 byte = 32 bit
同int型

double: 8 byte = 64 bit
范围:1.79769e+308 ~ 2.22507e-308

long double: 12 byte = 96 bit
范围: 1.18973e+4932 ~ 3.3621e-4932

float: 4 byte = 32 bit
范围: 3.40282e+038 ~ 1.17549e-038

long long的最大值:9223372036854775807(>10^18)
long long的最小值:-9223372036854775808
unsigned long long的最大值:18446744073709551615

__int64的最大值:9223372036854775807
__int64的最小值:-9223372036854775808
unsigned __int64的最大值:18446744073709551615

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值