分享一个有趣的int型转char型的方法,并求大家帮忙解惑。
前段时间,我发过一条微博:
我们在编程中经常会遇到需要把int转化为char型,一般有函数可以实现*(itoa……)
但是如果我们需要将每一位分开转化时该怎么做呢?
我在《C Traps and pitfalls》看到一个非常有趣的表达式:
"0123456789"[n%10]
1,用于十进制数n的各位转化为字符型式
2,提高可移植性:常理讲,我们可以这样做,(int)(n%10)+'0',对于ASCII字符集和EBCDIC字符集(字符集的数字连续排列)是正确的,对于符合ANSI的C实现也正确,但是对于某些机器可能会出错。(请问大家,是哪些机器?)
3,以空间换时间,提高转化速度。
4,宋宝华老师评论我这条微博说,他之前发表过一个这样的例子,是16进制的("0123456789ABCDEF"[n%10],不知道是不是这样 ?),说我的这个十进制不靠谱,我不知道哪里不靠谱,请大家帮忙分析下。 C 编程 移植 int转char
[解决办法]
各位->个位, 这个差别大了
十六进制至少得 "0123456789ABCDEF"[n%16] 吧.
[解决办法]
你这样只能转n的最低位吧。。。另外最后那个十六进制的应该是n%16吧。。
[解决办法]
sprintf
[解决办法]
1. 一般字符编码方法中, '0', '1', ...'9'都是连续的.如果不连续, n%10 + '0'就是错的.
2. 如'0', '1'...'9'编码连续:
对于10进制,n%10+'0'效率未必比"0123456789"[n/10]差.
对于16进制"0123456789ABCDEF"[n%10]更好,因为'0'-'9', 'A'-'E'都连续,两个区间不连续,不能简单是用n%16+'0',需要使用if-else等分支语句,性能就差了些.
[解决办法]
1,用于十进制数n的各位转化为字符型式
这个没有什么可以说的
2,提高可移植性:常理讲,我们可以这样做,(int)(n%10)+'0',对于ASCII字符集和EBCDIC字符集(字符集的数字连续排列)是正确的,对于符合ANSI的C实现也正确,但是对于某些机器可能会出错。(请问大家,是哪些机器?)
你可以设计这样的机器,我想没有谁会用吧?
3,以空间换时间,提高转化速度。
这才多少空间啊?速度也不一定快吧,"0123456789"[n%10]需要多访问一次内存的吧,(int)(n%10)+'0',这两个表达是中最费时间的算法是 n % 10, 这个需要10几条指令吧!
4,宋宝华老师评论我这条微博说,他之前发表过一个这样的例子,是16进制的("0123456789ABCDEF"[n%10],不知道是不是这样 ?),说我的这个十进制不靠谱,我不知道哪里不靠谱,请大家帮忙分析下。
"0123456789ABCDEF"[n%16]的写法,最早的起源也许难于难于考证,但是在4.4BSD里是就有这个写法了,既然如此,还发表和啥?
http://svnweb.freebsd.org/csrg/lib/libc/stdio/vfprintf.c?revision=61180&view=markup
[解决办法]
"0123456789ABCDEF"[n%16] 最早的用法也许在这里?
http://svnweb.freebsd.org/csrg/lib/libc/stdio/vfprintf.c?revision=34226&view=markup