C语言 | 数据类型隐形转换问题
数据类型转换就是将数据(变量、数值、表达式的结果等)从一种类型转换为另一种类型。
自动类型转换
自动类型转换就是编译器默默地、隐式地、偷偷地进行的数据类型转换,这种转换不需要程序员干预,会自动发生。
强制类型转换
自动类型转换是编译器根据代码的上下文环境自行判断的结果,有时候并不是那么“智能”,不能满足所有的需求。如果需要,程序员也可以自己在代码中明确地提出要进行类型转换,这称为强制类型转换。
自动类型转换是编译器默默地、隐式地进行的一种类型转换,不需要在代码中体现出来;强制类型转换是程序员明确提出的、需要通过特定格式的代码来指明的一种类型转换。换句话说,自动类型转换不需要程序员干预,强制类型转换必须有程序员干预。
实例代码1:
/*****************************************************
* > File Name: switch.c
* > Author: fly
* > Create Time: 2021-07-30 5/30 15:13:03 +0800
*==================================================*/
#include
int main(int argc, char* argv[])
{
unsigned long x;
signed long y;
y= -4;
x = y;
printf("y= %ldn", y);
printf("x= %lun", 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("rn #######%s, LINE = %d In DST!rn", __FUNCTION__,__LINE__);
}
else
{
DET_DST = TRUE;
debug_msg("rn #######%s, LINE = %d DET_DST!rn", __FUNCTION__,__LINE__);
}
接口UIAppDST_GMT2Hour的原来返回的是无符号型的,比如计算出来是-4,被隐形转为后是整型而且大于2,导致进入if里面执行不正确的代码。后续,也是对数据类型进行调整,才解决此问题。
拓展
C语言数据类型转换(自动类型转换+强制类型转换)
服务器托管,北京服务器托管,服务器租用 http://www.fwqtg.net
机房租用,北京机房租用,IDC机房托管, http://www.e1idc.net