LeetCode上有一个题目,是要求写代码实现int 大小的10进制整数(正负在内)转化为16进制。作为一个例题进行分析。
下面是本人仿优秀题解通过的代码:
参考题解:
1.对于正数的处理,只要一直除16取余,按顺序存储余数,最后逆序输出就可以了;
2.但是对于负整数,int在真正存储在内存中的二进制数不是值的原码,而是其补码,举例:若int变量的值为-1 ,那么在强制类型转换之前,int变量-1内存中存储的是1111 1111 1111 1111 1111 1111 1111 1111,等于2^32-1,在强转为unsigned int时,就是读取该块内存的值赋给无符号变量!(只是值的赋予,并不会改变负整数本身(存在内存中的二进制补码编码))
此外,要说明一点,内存中数值对计算机中来说是没区别的,-1以111.。。111存储,取出来就是0xfffffff,至于这个数表示什么,要看你对它的解释,如果解释成有符号的int类型,则是-1,如果解释成无符号int类型,则是4294967295。因此反过来说,我们把负整数-1转为16进制数,和把正整数4294967295转为16进制数,最后的出来的16进制数是一样的,就是一串从0到f的字符串。因此,我们在这个题中可以放心使用有符号数转无符号数来辅助我们解题。
(题外话1:电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址;人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母 .....等等)
(题外话2:关于强制转换为无符号数的情况,在不同的场合使用不小心的话还是有一些坑的,详细见博客下方优秀博客链接说明(墙裂建议看一看))
参考题解通过代码:
参考优秀博客:
负数是如何从内存中读取出来的?
负数赋值给无符号数的陷阱[转]