大部分程序对无符号数类型的使用可能不是很频繁(实际上,仅C/C++等少数语言支持unsigned类型)。但是,unsigned到signed的隐式强制转换常常会导致程序错误与漏洞,比较著名的一个案例就是:函数getpeername的安全漏洞。
一、从一道微软面试题说起
微软面试题:
<span style="font-size:18px;">
unsigned int i=3;
cout<<i*-1; </span>
问输出是多少?
如果忽略了有符号数到无符号数的隐式转换,答案就是-3,但是微软面试题没那么简单。
运行一下上面的程序,发现结果是4294967293。其实是因为i是unsigned int类型,而-1是int类型,一个无符号,一个有符号,编译时会发生强制类型转换,统一将有符号数转化为无符号数,然后再进行运算。
解析:
首先,要明确三点:
1、unsigned int和int类型的数据大小均为4字节,即32位。(无论是32位字长机器还是64位字长机器)2、机器一般都是用补码表示有符号数。

本文通过一道微软面试题探讨了有符号数到无符号数的转换,解释了-1转为无符号数时的计算过程,并指出这种转换可能导致的程序错误。同时,文章提到了C语言中超出无符号整型范围的乘法运算处理方式,以及计算数组元素和时可能遇到的问题和strlen函数在判断字符串长度中的应用。
最低0.47元/天 解锁文章
340

被折叠的 条评论
为什么被折叠?



