对itoa函数的分析

2024-08-28 04:08
文章标签 分析 函数 itoa

本文主要是介绍对itoa函数的分析,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

在文章GCC下itoa函数的演变:itoa with GCC中提到了几种itoa函数的写法,其中我觉得下面这个是最容易理解的方法:

/*** Ansi C "itoa" based on Kernighan & Ritchie's "Ansi C":*/
void strreverse(char* begin, char* end) {char aux;while(end>begin)aux=*end, *end--=*begin, *begin++=aux;
}void itoa(int value, char* str, int base) {static char num[] = "0123456789abcdefghijklmnopqrstuvwxyz";char* wstr=str;int sign;// Validate baseif (base<2 || base>35){ *wstr='\0'; return; }// Take care of signif ((sign=value) < 0) value = -value;// Conversion. Number is reversed.do {
//cout << "\t" << value % base << " ";
*wstr++ = num[value%base];
value = value / base;
} while(value);if(sign<0) *wstr++='-';*wstr='\0';// Reverse stringstrreverse(str,wstr-1);
}
该方法在一般情况下可以比较好的工作,但是当要将某个负整数转换为二进制时,其输出形式不太对,计算机中负数时二进制补码表示的。如下分别是windows的itoa函数和上述的itoa函数的验证函数:

int main() {int a;while (true) {cin >> a;char test[36];cout << itoa(a, test, 2) << endl; //windows的itoa函数cout << myitoa(a, test, 2) << endl; //上述itoa函数}
}
如下是几组测试数据结果图:

如上图所示:

            第一个测试的是正数,两个函数的转换后的二进制形式一样;

            第二个和第六个测试数据是负数,两个函数转换结果不一样:windows下函数的结果为负数的二进制补码形式,而我们写的函数是在负数的绝对值的二进制表示前加了一个“-”号;

          第三个测试的是正的最大数,两个函数输出的一样:31位1。

          第四组测试数据是负的最大数,此时我们写的函数并没有输出正确的值,这也正是我们所写函数的一个缺陷。可以通过改写为这个函数http://blog.csdn.net/u013074465/article/details/46499959#t12来避免这个“最小负整数”bug的问题。

          这里之所以出问题是因为最小的负整数-2147483648在我们所写的函数中通过value = -value将其转换为了2147483648,此数在有符号的数中是一个溢出了的数(32位机器的有符号整数的范围是-2147483648到2147483647);而windows和gcc的处理方式都是将一个溢出的负数表示为-2147483648(0x80000000)。所以,-2147483648经过语句“value = -value”后仍为-2147483648,那么在上述代码的do while循环中最后一次value % base的结果是-1:如果执行do while循环内的那个注释语句,输出结果依次为“0 0 0 0 0 0 0 00  ..... 0 0 -1”,这样的话,当执行语句:

*wstr++ = num[value%base];
最后一次是取得num[-1],该值是不确定的,所以上图中输出了一个问号"?"。


这篇关于对itoa函数的分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1113684

相关文章

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

Oracle的to_date()函数详解

《Oracle的to_date()函数详解》Oracle的to_date()函数用于日期格式转换,需要注意Oracle中不区分大小写的MM和mm格式代码,应使用mi代替分钟,此外,Oracle还支持毫... 目录oracle的to_date()函数一.在使用Oracle的to_date函数来做日期转换二.日

Redis连接失败:客户端IP不在白名单中的问题分析与解决方案

《Redis连接失败:客户端IP不在白名单中的问题分析与解决方案》在现代分布式系统中,Redis作为一种高性能的内存数据库,被广泛应用于缓存、消息队列、会话存储等场景,然而,在实际使用过程中,我们可能... 目录一、问题背景二、错误分析1. 错误信息解读2. 根本原因三、解决方案1. 将客户端IP添加到Re

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

锐捷和腾达哪个好? 两个品牌路由器对比分析

《锐捷和腾达哪个好?两个品牌路由器对比分析》在选择路由器时,Tenda和锐捷都是备受关注的品牌,各自有独特的产品特点和市场定位,选择哪个品牌的路由器更合适,实际上取决于你的具体需求和使用场景,我们从... 在选购路由器时,锐捷和腾达都是市场上备受关注的品牌,但它们的定位和特点却有所不同。锐捷更偏向企业级和专

Spring中Bean有关NullPointerException异常的原因分析

《Spring中Bean有关NullPointerException异常的原因分析》在Spring中使用@Autowired注解注入的bean不能在静态上下文中访问,否则会导致NullPointerE... 目录Spring中Bean有关NullPointerException异常的原因问题描述解决方案总结

python中的与时间相关的模块应用场景分析

《python中的与时间相关的模块应用场景分析》本文介绍了Python中与时间相关的几个重要模块:`time`、`datetime`、`calendar`、`timeit`、`pytz`和`dateu... 目录1. time 模块2. datetime 模块3. calendar 模块4. timeit

python-nmap实现python利用nmap进行扫描分析

《python-nmap实现python利用nmap进行扫描分析》Nmap是一个非常用的网络/端口扫描工具,如果想将nmap集成进你的工具里,可以使用python-nmap这个python库,它提供了... 目录前言python-nmap的基本使用PortScanner扫描PortScannerAsync异

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S