关于强制类型转换int→char的转换
代码如下:#include <stdio.h>
#include<stdlib.h>
int main(void)
{
int s=130;
unsigned char unChar=s;
char Char=s;
printf("%x\t%x\n",Char,unChar);//按16进制输出
printf("%d\t%d\n",Char,unChar);//按10进制输出
printf("%d\n",sizeof(Char));
char str;
char str1;
itoa(Char,str,2);//2即是代表转换为2进制
itoa(unChar,str1,2);//2即是代表转换为2进制
printf("char转换成二进制数是: %s\n\n",str);
printf("unchar转换成二进制数是: %s\n\n",str1);
return 0;
}
输出结果是 ffffff82 82
-126 130
1
char转换成二进制数是: 11111111111111111111111110000010
unchar转换成二进制数是: 10000010
查了下强制转换规则:(如从4字节的int类型转换成1个字节的char类型,则取int数据的最低的一个字节,将这个字节的数据赋给char型数据,且是有符号的,即首位为符号位;而如果是从int转换成unsigned char类型,则整个一个字节都是数据,没有符号位。)
按照这个逻辑来讲的话,Char这个变量放进去的应该是10000010,第一位当做符号位,把10000010以补码的形式存到内存里,怎么就变成了11111111111111111111111110000010,字节都变成4个字节的了,正常char不应该是1个字节嘛??
感觉和数在内存中以补码形式存在应该有关系,有没有大佬能解释下为什么嘛? 我也不太懂,@Twilight6,让她来{:10_256:} 因为默认是在32位的操作系统下了,所以补码部分外也全为1了;可参考8->16->32位系统的补码表示变化 我主要是不明白为什么字节就扩展了。。。而且这个把第一位当做符号位以后发生了什么,我看网上说负的二进制转10进制是这么计算的,比方说10000010:-1*2^7+0*2^6=0*2^5.......+1^2^1+0=-126,这个是怎么计算的呢? 我也想知道。我不明白char怎么成了ffffff82了。我拷贝去VS运行了,等会说结果。 我这也一样。调了半天。查过表,得知符号可以到255。然而char居然有符号。有符号的话,越界重新循环。这就是一个负数了。可能,要表示一个负数,必须用这个值吧。而16进制数为无符号数。要表示-126这个数,(调试,Char的值为-126),用一个无符号的数表示-126,在32位机器上,必须用这么长的数来表示。仅用来表示而已。 405794672 发表于 2020-6-5 10:49
我这也一样。调了半天。查过表,得知符号可以到255。然而char居然有符号。有符号的话,越界重新循环。这就 ...
大佬这个越界重新循环是指什么意思呢? 1sun15718 发表于 2020-6-5 11:09
大佬这个越界重新循环是指什么意思呢?
额。自己的思想就这么说出来了。这样的,比如一个流光灯,从后往前,到前面没路了,又重新从后往前。这样循环。也就是说,第一个前面就是它的末尾。相当于把头尾给它系在一起了。我想了绳子,主要想到了蛇{:7_114:},真是邪恶!
页:
[1]