C语言 | 数据类型隐形转换问题

C语言 | 数据类型隐形转换问题

数据类型转换就是将数据(变量、数值、表达式的结果等)从一种类型转换为另一种类型。

自动类型转换

自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。

强制类型转换

自动类型转换是编译器根据代码的上下文环境自行判断的结果,有时候并不是那么“智能”,不能满足所有的需求。如果需要,程序员也可以自己在代码中明确地提出要进行类型转换,这称为强制类型转换。

自动类型转换是编译器默默地、隐式地进行的一种类型转换,不需要在代码中体现出来;强制类型转换是程序员明确提出的、需要通过特定格式的代码来指明的一种类型转换。换句话说,自动类型转换不需要程序员干预,强制类型转换必须有程序员干预。

实例代码1:

/*****************************************************
 *   > File Name: switch.c
 *   > Author: fly
 *   > Create Time: 2021-07-30  5/30  15:13:03 +0800
 *==================================================*/
#include <stdio.h>

int main(int argc, char* argv[])
{
    unsigned long x;
    signed long y;
    y= -4;
    x = y;

    printf("y= %ld\n", y);
    printf("x= %lu\n", x);

    return 0;
}

运行结果:

fly@fly-vm:~/workSpace/test$ ./switch
y= -4
x= 18446744073709551612

x是无符号long型,y是有符号long型,x的精度比y高,当给x赋值-4时,-4会直接隐形转换为无符号型;所以输出结果如上图;

C语言中,unsigned不应该是无符号数吗?
为什么还是可以显示负数?

显示成有符号还是无符号,是根据printf的格式化参数来决定的。
%d是按照有符号输出,%u是按照无符号输出。
追问
既然这样,那unsigned这个语句还有什么作用,直接int 也可以用%u输出啊
追答
用unsigned定义变量,在C语言运算时有用。
譬如位移运算,无符号数右移时,高位补充0,
如果是有符号数右移,高位补充的是符号位的值
(负数的符号位是1,正数的符号位是0)。
另外,如果用%u输出有符号数,编译时可能会提示告警。

问题1:

在一个通过GPS更新时间的模块(包含DST功能)中,涉及时间的计算,本来时间是没有符号的,使用unsigned long来表示也是可以的,但是使用时间进行计算、比较,结果是有符号的。由于在升级SDK及优化代码时,为了消除类型不匹配时编译的警告,把大部分类型改成了unsigned long型。

该部分功能,有多个时区、多个国家的夏令时需要判断,然后通过计算结果比较,在获取的UTC时间上基础上将机器设置成符合本地的夏令时时间。

后续发现,某些时区上,时间更新和预期不符,差别太大。后来想,代码逻辑并不复杂,只是代码量过于庞大(由于代码结构问题,逻辑流并不十分清晰),一下子看不出哪里出了问题。没办法,只能用模拟GPS测试并和以前的OK的机器对比,通过打印才发现,在一些关键的逻辑判断(由于隐形转换导致计算结果偏差大)上出问题。

比如如下:

INT32 UIAppDST_GMT2Hour(INT32 hour, INT32 minus, BOOL en)
      
if(UIAppDST_GMT2Hour(gps_date_time.hour, gps_date_time.minute, en) >= 2)
{
     DST_flags = TRUE;
     DET_DST = FALSE;

     DST_SET_Year = g_dst_args[ii].year;
     DST_SET_Mon = g_dst_args[ii].end.mon;
     DST_SET_Day = g_dst_args[ii].end.day;
     debug_msg("\r\n #######%s, LINE = %d In DST!\r\n", __FUNCTION__,__LINE__);
}
else
{
    DET_DST = TRUE;
    debug_msg("\r\n #######%s, LINE = %d DET_DST!\r\n", __FUNCTION__,__LINE__);
}   

接口UIAppDST_GMT2Hour的原来返回的是无符号型的,比如计算出来是-4,被隐形转为后是整型而且大于2,导致进入if里面执行不正确的代码。后续,也是对数据类型进行调整,才解决此问题。

拓展

C语言数据类型转换(自动类型转换+强制类型转换)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值