关于c语言数据类型的小笔记

关于c语言数据类型的小笔记


同学今天问了我一个很基础的问题,却让我发现了自己在c语言基础上依旧存在着很多漏洞。
先上图
关于c语言数据类型的小笔记_第1张图片
这里主要讨论前三对的输出结果
关于c语言数据类型的小笔记_第2张图片
关于c语言数据类型的小笔记_第3张图片
关于c语言数据类型的小笔记_第4张图片
首先一个非常重要的点必须要记住,计算机只能识别0和1(高低电平),将此作为前提来思考会更加有助于理解。

数值在计算机中以补码的形式保存。那么例子中,-1为signed int型的值,补码是0xFFFFFFFF.

第一组中

将signed int型的-1分别以有符号整型和无符号整型输出,不需要类型转换,只需要分清有符号和无符号的区别。
%d有符号,所以在计算机看来,就是照原样输出,即补码为0xFFFFFFFF的数值就是-1,所以输出-1。
%u无符号,所以在计算机看来0xFFFFFFFF转化为十进制就是4294967295,输出。

第二组中

先进行类型转换,signed int转char,较为简单。char只有8位,只需要截断前面24位即可,也就是保留0xFF

然后进行输出,这里要注意:以整型输出字符型值得时候,会进行强制转化。所以要将0xFF重新转换为int型并输出。一般默认char即为signed char,是有符号的。
低位数据在转高位的数据类型时需要补二进制前面的位数,若有符号,补符号的相应数;若无符号,补0。

所以0xFF即为-1,前24位均补1.也就是补回0xFFFFFFFF。之后的输出原理便是和第一组相同了,结果也是一致的。

第三组中

先进行类型转换,signed intunsigned char。这里有另一个注意的点:
在计算机存储中,不会区分值到底是正数还是负数,只有在我们使用、输出的时候才会去区分。因此这一步与第二组中signed intchar的结果是一致的。
无论是有符号还是无符号,-1 的存值均为其补码,转为char即为0xFF

第二步同样是输出时的强制转化,参照第二组:无符号时,前位数均补0。所以最终结果是0x000000FF,也就是255。

最后分别以**%d%u**输出时:
%d:有符号,最高位为0,即为正,0xFF就是255。
%u:无符号,0xFF十进制输出,同样为255。

以上是参考unsigned int 类型使用谨记该文章所得,详情可以查看这篇文章,说的很详细。
我写在这里只是为了做笔记,巩固自己的理解并记录mark一下。

你可能感兴趣的:(知识学习贴)