宝安做棋牌网站建设哪家服务好,深圳建科技有限公司网站首页,百度一下搜索,大型网页设计公司后面作者会在2025.5.25 00:00前整理出笔记和思维导图大家放心#xff0c;主页还有其他文章 请先移步欢迎参考 收藏文章 关注博主 高效学习 好了#xff0c;这小节我们要探讨一个相对来说简单的问题#xff0c;就是C语言里边的那些定点整数是如何进行强制类型转换的。好来看这…后面作者会在2025.5.25 00:00前整理出笔记和思维导图大家放心主页还有其他文章 请先移步欢迎参考 收藏文章 关注博主 高效学习 好了这小节我们要探讨一个相对来说简单的问题就是C语言里边的那些定点整数是如何进行强制类型转换的。好来看这样的一个例子首先需要跟大家声明的是C语言当中的定点整数。 大家熟悉的什么int啊还有什么short还有long这些定点整数都是用补码的形式来存储的。另外C语言里还有一个关键字叫unsigned如果用unsigned来修饰short或者int或者long。 那就意味着这个定点整数它是一个无符号数。好来看一下现在有一个short型的短整数x它的值是负的四三二一那么由于是采用补码表示的。 并且短整形是占两个字节也就是。16个比特所以16个比特的补码表示负四三二一应该是这样的一个值这个大家可以自己转换一下。 源码补码如何转换这个我们之前已经强调过不熟悉的同学可以再自己动手试一下好现在我们。把x这个呃短整形的数。 把它强制转换成unsigned short也就是无符号的短整形。y那这种强制转换的规则是会把x的这个补码形式的数。完整不变的复制给y这个变量那由于y也是占两个字节。 所以y的机器代码其实和x是一模一样的。只不过由于y是一个无符号的短整形因此计算机在解析y的真值的时候会按照无符号整数来进行解析。所以这个二进制无符号数。 把转换成真值应该是对应这样的一个值同样的大家可以暂停来转换一下看看是不是这样 好那这是一个有符号的定点整数转换成长度相同的无符号定点整数的一个规则。不改变数据的二进制内容但是会改变它的解释方式。好。 再看第二个例子如果我们把一个更长的数据把它变成一个更短的数据啊这儿我们定义了两个int型的变量a和b。那大多数情况下C语言里边int型的数据占四个字节。那现在a和b是两个有符号的数都用补码的形式来保存。 当我们把a和b这两个数强制转换成short也就是由四个字节变成两个字节的时候。计算机的做法是会直接把高位截断然后只保留低位那a对应的16进制应该是这样的。 把这四个字节的内容截断只保留最低两个字节的内容也就是八六a一那更低的两个字节就是c这个变量的值。那由于c是一个有符号的短整形。 所以计算机会用补码的规则来对它进行解析与之对应的真值就应该是这样的一个值。这是一个16比特16位的布吗那对于b和d也是一样的b这个数呃。 它用补码表示应该是这样的把b转换成只有两个字节的d呃short类型那么就是只保留。更低的两个字节七七五幺。 那同样的由于d它是一个有符号的短整形所以计算机会用16比特补码的这种方式来对它进行解析与之对应的真值是这样的一个值。好。 那这是更长的数据转换成更短的数据的一个处理方式很残暴就是直接截断只保留更低的字节。好。 最后再来看更短的数据转换成更长的数据那这个问题其实我们之前聊过也就是所谓符号扩展的问题。好x原本是一个两个字节的补码呃。 总共占16位那么把short型的x转换成四字节的int型。计算机做的事情就是符号扩展那之前我们说过对于一个定点整数的补码来说。 如果它是一个负数。那么我们需要在高位呃也就是这个符号位和原有的数值位之间添一用这样的方式扩展得到的补码。 你把它解析为真值的话这个真值是不会变的。只不过是补码的整体长度拓展了而已好再来看n这个变量呃我们把x强制的转换为无符号类型。 然后把它复制给无符号的短整型n。那之前我们说过这种强制转换会把二进制代码原封不动的复制给n只不过计算机会以无符号数的规则来解析这一串机器数。那这是n所对应的一个真值好。 最后把无符号数n变成四个字节的无符号数p。那由于是无符号数到无符号数的转变因此直接在高位添零就可以。p和n的真值这个真值是保持不变的。 好那这就是C语言里边定点整数相关的一些强制类型转换第一个部分探讨的是在转换的两种数据长度相同的情况下呃无符号数和有符号数之间的一种转换规则。第二个部分探讨的是从长数据强转成短数据的一个处理方式。 而第三个部分探讨的是从短数据转为长数据的一个转变方式。