C++问题 char类型与int转化
#include<stdio.h>intmain(){for(inti=127;i<=130;i++){printf("当i为%d\n",i);char*nptr;cha...
#include <stdio.h>
int main()
{
for(int i =127; i<= 130; i++)
{
printf("当i为%d\n",i);
char *nptr;
char chA= (char)i;
printf("%c\n",chA);
nptr = &chA;
printf("%d\n",chA);
}
return 0;
}
这个是我做测试用的。char占一个字节 而且是带符号的当i=129,它就会把第一位当成符号位那应该输出-0啊,后面依次输出-1,-2·····为什么输出-127,-126,-125·····? 展开
int main()
{
for(int i =127; i<= 130; i++)
{
printf("当i为%d\n",i);
char *nptr;
char chA= (char)i;
printf("%c\n",chA);
nptr = &chA;
printf("%d\n",chA);
}
return 0;
}
这个是我做测试用的。char占一个字节 而且是带符号的当i=129,它就会把第一位当成符号位那应该输出-0啊,后面依次输出-1,-2·····为什么输出-127,-126,-125·····? 展开
5个回答
展开全部
因为负数是以补码的形式存在的。
nptr = &chA;
printf("%d\n",chA);
实际上是吧chA转换成了4字节长度(32位机器),可以认为又是一个int或long。但以下是一样的。
当你int i=128时:0x00000080。
截取为char后为:0x80二进制位:1000 0000,这是负数
而当你在取为int时,他会按符号位补全前面的,变成:0xffffff80,即1111 1111 1111 1111 1111 1111 1000 0000。(我把int按照4个byte计算)
除去前面的符号位,转换成原码是 000 0000 0000 0000 0000 0000 1000 0000
所以是-128。
129是0x00000081
变成char之后变回int是0xffffff81
去除符号之后原码为:0x0000007f是127,加符号是-127
下面的就这样继续推下去。你可以认为是从最大跳到最小继续+1。
nptr = &chA;
printf("%d\n",chA);
实际上是吧chA转换成了4字节长度(32位机器),可以认为又是一个int或long。但以下是一样的。
当你int i=128时:0x00000080。
截取为char后为:0x80二进制位:1000 0000,这是负数
而当你在取为int时,他会按符号位补全前面的,变成:0xffffff80,即1111 1111 1111 1111 1111 1111 1000 0000。(我把int按照4个byte计算)
除去前面的符号位,转换成原码是 000 0000 0000 0000 0000 0000 1000 0000
所以是-128。
129是0x00000081
变成char之后变回int是0xffffff81
去除符号之后原码为:0x0000007f是127,加符号是-127
下面的就这样继续推下去。你可以认为是从最大跳到最小继续+1。
展开全部
你是不是该考虑字符的溢出。对于char类型是8个bit,所以能存储的数据范围为-128~127,所以你的输出会错误。你把char 改成无符号型unsigned char.
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
没错啊,127是01111111,是正数,计算机保留,128是10000000是负数,计算机-1后取反还是原来的数但是是-128,因为8位数的数码是从-128~127的,129是10000001。减一取反就是127,但是首位是0,所以是-127,以此类推,剩下的你会算吧
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你用二进制算算看就知道了,cpu中有一个溢出标志位,如果内存有溢出,那标志位就会变成1,并把这个标志位做为二进制数的符号位
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
你理解错了高位字节和低位字节。
首先a=256+69在编译之后编译器就预先计算了256+69为325,所以a=256+69和a=325是一样的;
325的二进制是:1
0100
0101
取低位字节(后位8)0100
0101=69
(e)
;所以
低位字节并不是说表达式的后面几个数,如果
表达式换成a=300+25
结果还是
e(69),而不是25;
在你的第二个问题中;
ch='a+b'
语法是错的
单引号里面只能是一个字符,如果要给出字符串的话应该是:char
*ch;ch="a+b";
;如果你理解了上面的低位字节你不会有下面的疑问了
首先a=256+69在编译之后编译器就预先计算了256+69为325,所以a=256+69和a=325是一样的;
325的二进制是:1
0100
0101
取低位字节(后位8)0100
0101=69
(e)
;所以
低位字节并不是说表达式的后面几个数,如果
表达式换成a=300+25
结果还是
e(69),而不是25;
在你的第二个问题中;
ch='a+b'
语法是错的
单引号里面只能是一个字符,如果要给出字符串的话应该是:char
*ch;ch="a+b";
;如果你理解了上面的低位字节你不会有下面的疑问了
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询