【csapp】【微软面试题】有符号数到无符号数隐式转换

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

大部分程序对无符号数类型的使用可能不是很频繁(实际上,仅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、机器一般都是用补码表示有符号数。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值