对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

相关文章

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

怎样通过分析GC日志来定位Java进程的内存问题

《怎样通过分析GC日志来定位Java进程的内存问题》:本文主要介绍怎样通过分析GC日志来定位Java进程的内存问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、GC 日志基础配置1. 启用详细 GC 日志2. 不同收集器的日志格式二、关键指标与分析维度1.

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT

MySQL 中 ROW_NUMBER() 函数最佳实践

《MySQL中ROW_NUMBER()函数最佳实践》MySQL中ROW_NUMBER()函数,作为窗口函数为每行分配唯一连续序号,区别于RANK()和DENSE_RANK(),特别适合分页、去重... 目录mysql 中 ROW_NUMBER() 函数详解一、基础语法二、核心特点三、典型应用场景1. 数据分

MySQL中的表连接原理分析

《MySQL中的表连接原理分析》:本文主要介绍MySQL中的表连接原理分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、背景2、环境3、表连接原理【1】驱动表和被驱动表【2】内连接【3】外连接【4编程】嵌套循环连接【5】join buffer4、总结1、背景

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Python get()函数用法案例详解

《Pythonget()函数用法案例详解》在Python中,get()是字典(dict)类型的内置方法,用于安全地获取字典中指定键对应的值,它的核心作用是避免因访问不存在的键而引发KeyError错... 目录简介基本语法一、用法二、案例:安全访问未知键三、案例:配置参数默认值简介python是一种高级编

python 常见数学公式函数使用详解(最新推荐)

《python常见数学公式函数使用详解(最新推荐)》文章介绍了Python的数学计算工具,涵盖内置函数、math/cmath标准库及numpy/scipy/sympy第三方库,支持从基础算术到复杂数... 目录python 数学公式与函数大全1. 基本数学运算1.1 算术运算1.2 分数与小数2. 数学函数

python中Hash使用场景分析

《python中Hash使用场景分析》Python的hash()函数用于获取对象哈希值,常用于字典和集合,不可变类型可哈希,可变类型不可,常见算法包括除法、乘法、平方取中和随机数哈希,各有优缺点,需根... 目录python中的 Hash除法哈希算法乘法哈希算法平方取中法随机数哈希算法小结在Python中,

Java Stream的distinct去重原理分析

《JavaStream的distinct去重原理分析》Javastream中的distinct方法用于去除流中的重复元素,它返回一个包含过滤后唯一元素的新流,该方法会根据元素的hashcode和eq... 目录一、distinct 的基础用法与核心特性二、distinct 的底层实现原理1. 顺序流中的去重