塔格德 2022-07-30 22:16 采纳率: 100%
浏览 30
已结题

C语言学习中遇到的有关char数据类型的问题

各位好,今天在学习C语言的循环结构后在做练习题,遇到了研究后还是不理解的代码,想请教一下这段代码的原理,具体内容如下:
题目:“你能看出下边代码会打印哪个范围内的所有数值呢?”

#include <stdio.h>

int main()
{
        signed char i = 0;

        while (i <= 0)
        {
                printf("%d", i);
                i = i - 1;
        }

        return 0;
}

我的答案:char数据类型长度为一个字节,而signed char的取值范围为 -128到127,所以会输出0到-127范围内的所有整数。
正确答案:会输出 0 到 128 范围内的所有整数。
我的疑问:我理解有符号的char数据类型的范围是-128到127,循环中的代码是不断递减i直至-127并输出对应数值,但是经过单步调试后发现这个循环到-128后,下一个循环变为127(到这一步我还理解),但再下一个循环之后程序就结束了,并且输出了0 ~ 128 范围内的所有整数,但是为什么会输出了0-128这个范围内的所有整数而不是0到-127范围内的所有整数呢?

还请指点迷津,谢谢!

  • 写回答

2条回答 默认 最新

  • 私房菜 移动开发领域优质创作者 2022-07-31 09:48
    关注

    请确认你的描述,你的描述确认是对的吗?

    首先,你定义的signed char,是8个bits,也就是从-128 ~ 127
    其次,你的变量 i 是从0 开始,while 循环也是从 <= 0 开始,那么,
    第一个打印肯定是0.。。。。。。
    第二个打印是0-1,所以,对于8个bits 的0,即二进制0000 0000,减去1之后,应该变量1111 1111,也就是-1
    第三个打印是-1-1,二进制为1111 1111 减去1,也就是 1111 1110,也就是-2
    依次类推,一直到1000 0000,也就是-128
    当-128 也就是二进制的1000 0000,减去1 之后,二进制变为0111 1111,也就是127.。。。。。
    再次进入while,127 <= 0 不成立,退出while 循环。。。。。
    你这个程序的正确答应应该是:

    0-1-2-3-4-5-6-7-8-9-10-11-12-13-14-15-16-17-18-19-20-21-22-23-24-25-26-27-28-29-30-31-32-33-34-35-36-37-38-39-40-41-42-43-44-45-46-47-48-49-50-51-52-53-54-55-56-57-58-59-60-61-62-63-64-65-66-67-68-69-70-71-72-73-74-75-76-77-78-79-80-81-82-83-84-85-86-87-88-89-90-91-92-93-94-95-96-97-98-99-100-101-102-103-104-105-106-107-108-109-110-111-112-113-114-115-116-117-118-119-120-121-122-123-124-125-126-127-128

    也就是 -128 ~ 0,完全没问题。。。。也就是你需要表达的正确方向。。。。。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 8月8日
  • 已采纳回答 7月31日
  • 创建了问题 7月30日

悬赏问题

  • ¥15 想问一下树莓派接上显示屏后出现如图所示画面,是什么问题导致的
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line
  • ¥500 火焰左右视图、视差(基于双目相机)
  • ¥100 set_link_state
  • ¥15 虚幻5 UE美术毛发渲染
  • ¥15 CVRP 图论 物流运输优化
  • ¥15 Tableau online 嵌入ppt失败
  • ¥100 支付宝网页转账系统不识别账号