char类型与int类型的相互转换、

相关知识:

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

2.这256个数字相同的部分是0+127,都用0x000x7F表示存储。而0x800xFF即可以表示+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字节的形式,当它给无符号赋值的时候,读取后就为232那么大的数了,对应2字节则为216大的数,但是还有一个疑问,为什么赋值给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

作者:寂寂寂寂寂蝶丶
来源:CSDN
原文:https://blog.csdn.net/SwordArcher/article/details/82351996
版权声明:本文为博主原创文章,转载请附上博文链接!

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值