| 网站首页 | 业界新闻 | 群组 | 交易 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 200 人关注过本帖, 1 人收藏
标题:输出结果为什么是-129
只看楼主 加入收藏
堕落之地
Rank: 1
等 级:新手上路
帖 子:38
专家分: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
2019-03-11 15:21
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:291
帖 子:6164
专家分:35580
注 册: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
等 级:新手上路
帖 子:38
专家分:5
注 册:2019-3-11
  得分:0 
回复 楼主 堕落之地
为什么下面的输出可以,
2019-03-11 15:41
堕落之地
Rank: 1
等 级:新手上路
帖 子:38
专家分: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
等 级:新手上路
帖 子:38
专家分: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
等 级:版主
威 望:291
帖 子:6164
专家分:35580
注 册: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
等 级:新手上路
帖 子:38
专家分:5
注 册:2019-3-11
  得分:0 
回复 6楼 rjsp
谢谢,这下我懂了
2019-03-11 16:03
word123
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:10
帖 子:248
专家分:1206
注 册:2014-4-5
  得分:0 

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

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







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

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