C程序设计语言第二版习题3-4

简介: 在数的反码表示中,上述的 itoa 函数不能处理最大的负数,即 n 等于-2^(字长-1) 的情况。请解释其原因。修改该函数,使它在任何机器上运行时都能打印出正确的值。

问题描述

在数的反码表示中,上述的 itoa 函数不能处理最大的负数,即 n 等于-2^(字长-1) 的情况。请解释其原因。修改该函数,使它在任何机器上运行时都能打印出正确的值。

问题分解

  • 主函数main
  • 核心函数 itoa(n, s)。先来看原文的函数实现:
void itoa(int n, char s[])
{
        int i, sign;
        if((sign = n) < 0){
                n = -n;
        }
        i = 0;
        do{
                s[i++] = n % 10 + '0';
        }while((n /= 10) > 0);
​
        if(sign < 0){
                s[i++] = '-';
        }
        s[i] = '\0';
        reverse(s);
}

先来分析itoa函数为什么不能处理最大的负数,我们假设在int数据取值范围位-128 ~ 127 的机器上,当n = -128时,-n = 128 > 127,此时灾难发生了——得到的结果并不是我们想要的字符串。因此,问题处在 if((sign = n) < 0) 这句,那么我们只要将其改造一下即可。

代码实现

#include<stdio.h>
​
void itoa(int n, char s[]);
void itoa2(int n, char s[]);
void reverse(char s[]);
​
int main()
{
        int n = (~0U >> 1) + 1;
        char s[100], s1[100], s2[100];
        printf("The input number is: %d\n", n);
        itoa(n, s);
        printf("The output string of itoa is: %s\n", s);
​
        itoa2(n, s1);
        printf("The output string of itoa2 is: %s\n", s1);
        return 0;
}
​
void itoa2(int n, char s[])
{
    int sign, i;
    sign = n;
    i = 0;
    do {
        s[i++] = ((sign < 0) ?-(n % 10) : n % 10) + '0'; //负数对10求余仍然是负数
    } while ((n /= 10) != 0);
    if (sign < 0)
        s[i++] = '-';
    s[i] = '\0';
    reverse(s);
}
​
void itoa(int n, char s[])
{
        int i, sign;
        if((sign = n) < 0){
                n = -n;
        }
        i = 0;
        do{
                s[i++] = n % 10 + '0';
        }while((n /= 10) > 0);
​
        if(sign < 0){
                s[i++] = '-';
        }
        s[i] = '\0';
        reverse(s);
}
void reverse(char s[])
{
    int i, j, c;
    for (j = 0; s[j] != '\0'; j++)
        ;
    for (i = 0, j--; i < j; i++, j--)
    {
        c = s[i];
        s[i] = s[j];
        s[j] = c;
    }
}

编译运行

image

由运行结果可看出,原方法得到的结果不是预期的,改造后的得到了正确的结果。

目录
相关文章
|
数据库
OVS 总体架构、源码结构及数据流程全面解析
在前文「从 Bridge 到 OVS」中,我们已经对 OVS 进行了一番探索。本文决定从 OVS 的整体架构到各个组件都进行一个详细的介绍。 OVS 架构 OVS 是产品级的虚拟交换机,大量应用在生产环境中,支撑整个数据中心虚拟网络的运转。
4983 0
|
9月前
|
弹性计算 运维 安全
阿里云CNAPP云安全中心全解析:优势、费用、合规及使用一文说透
阿里云CNAPP(智能云原生应用保护平台)整合CWPP、CSPM、CIEM与CTDR四大能力,提供覆盖“事前-事中-事后”的全链路安全防护。支持多云统一管理,内置380+检测模型,具备等保、ISO、PCI DSS等20+合规认证,助力企业实现一体化、智能化安全运营。免费版开放基础功能,高级版按需付费,新用户享15天全功能试用,快速构建云上安全防线。
|
机器学习/深度学习 人工智能 知识图谱
从“看图说话”到“脑补世界”:多模态大模型的进化之路
从“看图说话”到“脑补世界”:多模态大模型的进化之路
745 63
|
6月前
|
监控 网络协议 C#
基于C#的TCP/IP通信客户端与服务器
基于C#的TCP/IP通信客户端与服务器
495 0
|
前端开发 Java 数据库
Java 项目实战从入门到精通 :Java Web 在线商城项目开发指南
本文介绍了一个基于Java Web的在线商城项目,涵盖技术方案与应用实例。项目采用Spring、Spring MVC和MyBatis框架,结合MySQL数据库,实现商品展示、购物车、用户注册登录等核心功能。通过Spring Boot快速搭建项目结构,使用JPA进行数据持久化,并通过Thymeleaf模板展示页面。项目结构清晰,适合Java Web初学者学习与拓展。
779 1
|
Linux 虚拟化
vmware虚拟机安装2024(超详细)
vmware虚拟机安装2024(超详细)
1694 6
|
机器学习/深度学习 人工智能 大数据
特征越多模型越好?这个AI领域的常识可能是错的
特征选择是机器学习中的"减肥秘方",它能帮助模型去除冗余特征,提高性能并降低计算成本。本文深入浅出地介绍特征选择的概念、方法与实践技巧,带你掌握这门让AI模型更高效的"瘦身术"。
551 1
|
机器学习/深度学习 人工智能 监控
《智破光影迷宫:人工智能图像识别的进阶挑战》
在数字化时代,人工智能图像识别技术广泛应用于安防、医疗、交通等领域,显著提升了工作效率和准确性。然而,复杂背景与光照变化成为其发展的两大挑战。复杂背景使目标识别如大海捞针,光照变化则导致同一对象在不同条件下被误判。为应对这些挑战,深度学习技术如卷积神经网络(CNN)崭露头角,通过自动学习多层次特征提高识别精度。同时,光照归一化技术和数据增强等方法也有效提升了图像识别的鲁棒性。未来,随着算法优化和数据积累,图像识别技术将更加智能精准,为社会带来更多的便利与安全保障。
646 7
|
移动开发 编解码 缓存
基于 H5 Canvas "指纹识别" 技术 【浏览器指纹 VS Canvas指纹】
基于 H5 Canvas "指纹识别" 技术 【浏览器指纹 VS Canvas指纹】
1614 0
基于 H5 Canvas "指纹识别" 技术 【浏览器指纹 VS Canvas指纹】
|
网络协议 安全 网络性能优化
了解访问控制列表 (ACL):概念、类型与应用
了解访问控制列表 (ACL):概念、类型与应用
1779 2

热门文章

最新文章