C语言中的符号位对数据的影响。

文章目录

概要

        C语言中有一个容易踩坑的陷阱就是数据类型的转换,无论是新手还是老手,使用变量的过程中如果不知道这个问题,或者忘记注意这方面的问题,就会导致莫名奇妙的bug,本文将使用printf函数非常直观的揭露你的数据如何让你在不知情的情况下悄悄变化的。

技术细节 

    首先我们观察pritnf打印的一些细节

     观察第6行,定义了一个无符号的整数d,而我们第10行打印的是一个负数,也就是说在打印时,会根据打印的类型隐式的进行强制转换。

    第11行是正儿八经打印你定义的数值,注意,整形是4个字节,所以要使用%u,如果你使用%hd来打印d,那么打印出来的数据就是0,这里我就不放图了。另一个细节就是在8位的单片机里面,整形和短整型都是2个字节的。

   第12行打印的数据是无符号短整型变量(2字节)变量 i ,但是打印的数据却是 -32768,这说明%hd是打印有符号的短整型变量,它将我们无符号的变量i,自动转换为了有符号的数。

   第13行使用%d打印的就是正儿八经的我们期望看到的变量值——32768,

    细节:%d可以打印有符号和无符号的短整型,但是对于整形,打印出来的一定是有符号的。

   第14,15和16行进一步说明运算之后的打印结果,32768+1之后,使用%hd打印出来的是-32767,使用%i打印出来的是32769,我们定义的是无符号变量,后一个结果才是我们期望看到的。

  第17,18,19行,32768-1之后,使用%hd和%d打印出来的都是32767,这是因为 最高位的符号在减一之后变成了0,二进制位 0111 1111 1111 1111 。

  第20-21行说明一个正的短整型变量在赋值给浮点型数据时,不会影响运算的正确性。不过22-25行就向我们揭露了一个

    细节:无符号的短整型移位赋值给浮点型数据后,如果你不先强制转换为无符号的整形再使用的话,若移动的位数影响到了符号位,则其值会在不经意间变成一个负数,无符号短整型不能直接移位给浮点型,请下看图,看看你的bug是怎么出现的。

    惊不惊喜?意不意外?无符号短整型变成了有符号浮点型。

    还有一个连=号在不同数据类型下的细节,结果如下图。第一个k1打印出来的是整数,第二个却是负数,这是因为在赋值时,i首先被强制转换为有符号整形,然后传递给f,f再传递给j时又隐式的转换为无符号的,再给k,所以连=号是依次赋值的,使用时一定要注意这方面可能出现的bug。

         还有一点就是,对于有符号数据,不使用按位取反 “ ~ ” ,和异或  “ ^ ” 时一定要注意符号位的变化,否则会出现预料之外的变化,这种非语法错误是最难寻找的。

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

沉缘铭尘

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值