标题:输出结果为什么是-129
只看楼主
堕落之地
Rank: 1
等 级:新手上路
帖 子:57
专家分:5
注 册:2019-3-11
结帖率:100%
 问题点数:0 回复次数:9 
输出结果为什么是-129
#include<stdio.h>
int main(){
    char a=0;
    int b=0;
    while(++a>0);
    printf("有有符号的char最大整数是%d\n",a-1);//为什么输出谁-129,不是127.
    while(++b>0);
    printf("有符号的int最大整数是%d\n",b-1);
    char d=127;
    d=d+1;
    printf("%d\n",d);
    d=d-1;
    printf("%d\n",d);
    unsigned char e=255;
    e=e+1;
        printf("%d\n",e);gcc
        e=e-1;
            printf("%d\n",e);
}
第一个printf为什么是-129,不是127
搜索更多相关主题的帖子: 输出 结果 int char printf 
2019-03-11 15:21
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
有符号整型的溢出,已经是“未定义行为”了,没有研究的必要

如果一定要无聊的解释,
当 a == 127 时,执行 while(++a>0) 后,a变为-128(申明一下,未必是这样,因为这是“未定义行为”),条件不成立退出while
然后到 printf("有有符号的char最大整数是%d\n",a-1); 中 a-1 是 int 类型(估计题主认为a-1是char类型),值为 -129
2019-03-11 15:32
堕落之地
Rank: 1
等 级:新手上路
帖 子:57
专家分:5
注 册:2019-3-11
得分:0 
回复 楼主 堕落之地
为什么下面的输出可以,
2019-03-11 15:41
堕落之地
Rank: 1
等 级:新手上路
帖 子:57
专家分:5
注 册:2019-3-11
得分:0 
char d=127;
    d=d+1;
    printf("%d\n",d);
    d=d-1;
    printf("%d\n",d););
这个输出的是正确的
2019-03-11 15:42
堕落之地
Rank: 1
等 级:新手上路
帖 子:57
专家分:5
注 册:2019-3-11
得分:0 
回复 2楼 rjsp
char d=127;
    d=d+1;
    printf("%d\n",d);
    d=d-1;
    printf("%d\n",d););
这个输出的是正确的
2019-03-11 15:43
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:507
帖 子:8890
专家分:53117
注 册:2011-1-18
得分:0 
回答了,你又不肯看一眼,何必呢
我已经回答了,就是2楼的第二个红色字 ------  “a-1 是 int 类型”

在 char 为具符号类型的平台上(声明一下,标准未规定char必须是具符号类型):
char(-128) + 1 的结果是 int(-129),所以 printf("%d",a-1) 输出 -129
而你在5楼的代码,d=d-1 又将 int(-129) 赋给了一个char类型的变量,截断为char(127)。(声明一下,int(-129)已经超出char的表示范围,标准将之归为“未定义行为”)

2019-03-11 15:59
堕落之地
Rank: 1
等 级:新手上路
帖 子:57
专家分:5
注 册:2019-3-11
得分:0 
回复 6楼 rjsp
谢谢,这下我懂了
2019-03-11 16:03
word123
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:13
帖 子:333
专家分:1622
注 册:2014-4-5
得分:0 

执行具体过程大概这样吧
2019-03-11 16:25
堕落之地
Rank: 1
等 级:新手上路
帖 子:57
专家分:5
注 册:2019-3-11
得分:0 
回复 8楼 word123
谢谢,大佬
2019-03-11 16:30
waterstar
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:5
帖 子:984
专家分:2810
注 册:2010-2-12
得分:0 
127在单字节中保存的二进制是01111111,+1之后就是10000000,而计算机中,有符号数的最高位表示的是-2^(n-1),这里n是8,所以这输出的值就是-129

冰冻三尺,非一日之寒;士别三日,不足刮目相看!
2019-03-11 19:37



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-493517-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.117216 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved