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

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所以判定为负数,又因为负数在内存中是以补码的形式存储,所以要求其十进制表示的大小需要求它的原码,也就是除了符号位1之外的原码,先进行-1得到1100101,再次取反得到0011010,对应十进制数为26,加上之前的标志位为负数,所以得到打印出的数为-26,而赋值给unsigned char则正常运算即可,但有俩个问题还存在疑惑,一个是赋值给char截断后的数按照十六进制打印出来,为什么还会打印出这么多位?不应该只有俩位嘛?另一个是当i取值128时打印出来的十进制数时-128,个人计算时-127,不知道是哪里算错了,希望有高手来解答

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

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

你可能感兴趣的:(C语言)