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·····?
展开
 我来答
百度网友a671ecd3f
2010-10-24 · TA获得超过779个赞
知道小有建树答主
回答量:175
采纳率:0%
帮助的人:287万
展开全部
因为负数是以补码的形式存在的。
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。
百度网友fe7dceac7
2010-10-24 · TA获得超过832个赞
知道小有建树答主
回答量:384
采纳率:0%
帮助的人:423万
展开全部
你是不是该考虑字符的溢出。对于char类型是8个bit,所以能存储的数据范围为-128~127,所以你的输出会错误。你把char 改成无符号型unsigned char.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
密码比较简单
2010-10-24 · TA获得超过1996个赞
知道小有建树答主
回答量:1083
采纳率:0%
帮助的人:764万
展开全部
没错啊,127是01111111,是正数,计算机保留,128是10000000是负数,计算机-1后取反还是原来的数但是是-128,因为8位数的数码是从-128~127的,129是10000001。减一取反就是127,但是首位是0,所以是-127,以此类推,剩下的你会算吧
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
dqxl06rh001
2010-10-24 · TA获得超过101个赞
知道答主
回答量:15
采纳率:0%
帮助的人:0
展开全部
你用二进制算算看就知道了,cpu中有一个溢出标志位,如果内存有溢出,那标志位就会变成1,并把这个标志位做为二进制数的符号位
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
大叡毓采枫
2020-04-01 · TA获得超过4435个赞
知道大有可为答主
回答量:3137
采纳率:29%
帮助的人:208万
展开全部
你理解错了高位字节和低位字节。
首先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";
;如果你理解了上面的低位字节你不会有下面的疑问了
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式