[转载]C++ 中有符号类型到无符号类型的转换(C和C++程序员面试秘笈P9面试题6)

本文复制自https://blog.csdn.net/abnerwang2014/article/details/20656423,是为了本身之后查看方便才复制过来的,谢谢原博主git

为了更好地解释下面的代码,先来介绍一些背景知识,在个人计算机中, char 类型占 8 个比特位,那么, unsigned char 类型能表示的数的范围为 0 ~ 2的8次方 - 1,即 0 ~ 255,共 256 个数;int 类型占 32 个比特位,那么 unsigned 类型所能表示的数的范围为 0 ~ 2的32次方 - 1,即 0 ~ 4294967295,共 4294967296 个数,接下来看下面的代码:github

这是我写在 Emacs 上的代码,运行结果以下图:
spa


下面对上图的运行结果进行解释:.net

unsigned char 类型能表示的数的范围为 0 ~ 255,可是咱们给属于此类型的 c 和 j 赋值分别为 -10 和 258,显然超过了此类型所能表示的数的范围,在此例中,有如下三种状况:code

( 一 )、 当咱们所赋的值为 负值 时,如以上代码中变量 c 的情形,给它一个值 -10,最后将 c 的值赋给 d 后输出,获得 d = 246,即给 c 变量赋值 -10 后,它的值变为 246,这是为何呢?这是因为当咱们给一个无符号类型赋一个 负值 时,其结果是咱们所赋的值与这个无符号类型能表示的数的总个数的和,即 d = -10 + 256,这样一来结果固然是 246 了,显然 246 是在此无符号类型所能表示的数的范围内的(0 ~ 255),那么,若是相加后假若仍然不在这个无符号类型所能表示的数的范围内该怎么办呢?譬如如下的代码:对象

运行后的结果以下:
blog


给 m 赋值为 -258 ,最后 n = 254 ,即 m 的值变为了254 ,这又是什么状况呢?按照以上分析的逻辑, -258 + 256 = -2, -2 仍然不在 unsigned char 所能表示的数的范围内,这个时候怎么办呢?显然,只须要将 -2 + 256,等于 254, 254 在 unsigned char 所能表示的数的范围内,因此最后的结果为 254,跟以上运行最后得出的结果相符合,故由以上分析,能够得出如下结论:seo

当咱们给一个无符号类型赋一个超过其表示范围的负值时,其最后的结果是该负值与该无符号类型所能表示的数的总个数的和,若是所得结果仍是一个不在此类型表示范围的负数,则将所得结果重复以上相加的过程,直到最后获得一个在其表示范围的数,此即为最后的结果ci

( 二 )、 让咱们把目光转回到第一个代码片断,将 unsigned char j 赋一个超出其表示范围内的 正值 258 后,将 j 的值赋给 k,最后输出 k = 2,即 j 的值变为了 2 ,这又是为何呢?实际上,当咱们赋给一个无符号类型一个超出它表示范围的 正值时,结果是将咱们所赋的这个值对此无符号类型所能表示的数的总个数取模后的余数,即 258 % 256 = 2,符合程序运行结果get

( 三 )、 观察第一个代码片断中第 11 行以后的部分,一个有符号数 i 与一个无符号数 u 相加的情形,最后获得 4294967264 这么一个奇怪的数字,而不是像但愿的同样获得 -32 ,这是为何呢?这是由于这个表达式中无符号数大于有符号数,此种情形下,当把一个有符号类型和无符号类型相加时,须要先将有符号类型的数转换为无符号类型的数后再进行加法运算,(一)(二)中已经详细说明了怎样将一个有符号类型的数转换为一个无符号类型的数,对于这种状况,-42 + 4294967296 = 4294967254 ,在 unsigned 的表示范围内,即 -42 转换为无符号类型后为 4294967254 ,而后再将此数值加上 i (即 10 ) ,得 4294967264 ,符合最后获得的程序运行结果,关于这部份内容详见个人博客 C++ 无符号类型的运算对象参与的类型转换

最后咱们还须要另外强调的一点是,当咱们给带符号类型赋予一个超过其表示范围的值时,其结果是未定义的,程序可能继续执行,可能崩溃,也可能生成垃圾数据

本文来自 abnerwang_smile 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/abnerwang2014/article/details/20656423?utm_source=copy

相关文章
相关标签/搜索