1. 整型和枚举类型数据的转换
测试代码如下:
#include <stdio.h>
typedef enum _E_TYPE_T
{
E_TYPE_1 = -1,
E_TYPE_2,
E_TYPE_3,
E_TYPE_END
}E_TYPE_T;
int main(int argc, char* argv[])
{
unsigned char ui1_value = 0;
E_TYPE_T e_type = E_TYPE_1;
printf("\nui1_value=%d,e_type=%d,e_type=%x\n", ui1_value, e_type, e_type);
ui1_value = e_type;
e_type = ui1_value;
printf("\nui1_value=%d,e_type=%d,e_type=%x\n", ui1_value, e_type, e_type);
return 0;
}
[~sh] gcc -o type_conversion_main type_conversion_main.c
[~sh] ./type_conversion_main
ui1_value=0,e_type=-1,e_type=ffffffff
ui1_value=255,e_type=255,e_type=ff
从实际运行结果来看,经过转换后的e_type的值显然不是程序员所期望的,这就会导致程序出错。
那应该要如何规避这个问题呢?大概有两种解法,
第一种就是不要定义unsigned char类型的ui1_value,而是定义一个signed char类型的i1_value,
第二种方法就是枚举类型中的成员从0开始计算,这样就可以避免有符号数和无符号数操作带来
的隐式数据转换,经过测试这两种方法均可行。
2. 整型和指针之间的转换
测试代码如下:
#include <stdio.h>
static int _get_data(int* pui4_value)
{
*pui4_value = 0x12345678;
return 0;
}
int main(int argc, char* argv[])
{
char ui1_value_0 = 0;
char ui1_value_1 = 0;
char ui1_value_2 = 0;
_get_data((int*)&ui1_value_2);
printf("\ui1_value_0=%d,ui1_value_1=%d,ui1_value_2=%x\n", ui1_value_0, ui1_value_1, ui1_value_2);
return 0;
}
[~sh] gcc -o type_conversion_main type_conversion_main.c
[~sh] ./type_conversion_main
ui1_value_0=34,ui1_value_1=56,ui1_value_2=78
[~sh]
这是怎么回事?明明只是去修改ui1_value_2,但是ui1_value_0,ui1_value_1的值怎么会变?
仔细的看,这个很有规律,原来是踩内存了。
原来int类型的数据会占用4个字节的内存,_get_data的参数是int*类型,所以调用_get_data后
它会回写四个字节的数据到指定的地址。
而ui1_value_2是char类型的数据,它只占用1个自己的内存空间,所以_get_data就会从ui1_value_2所处的地址
连续的写入4个字节的数据。
所以,我们知道,使用指针参数时一定要预留足够的空间以便于存储回传的数据,否则很容易就会踩内存;
而踩内存造成的后果是会出现大问题的。
此例的解法就是:定义一个int类型的变量ui4_value来接收_get_data的回传值,
经测试该方法可行。
3. signed和unsigned类型数据之间的转换
测试代码如下:
#include <stdio.h>
int main(int argc, char* argv[])
{
signed char i1_value = -100;
unsigned char ui1_value = 10;
unsigned signed char sum = 0;
sum = i1_value + ui1_value;
printf("\nsum=%d\n", sum);
return 0;
}
[~sh] gcc -o type_conversion_main type_conversion_main.c
[~sh] ./type_conversion_main
sum=166
[~sh]
这显然不是程序员所期望的结果。之所以出现这样的结果,是因为这涉及到数据转换中的一个隐式自动转换规则。
因为sum是unsigned char类型的数据,所以在做加法运算时i1_value被自动转换为unsigned char类型,
从而导致程序出现不预期的结果。
此例的解法就是定义sum为signed char类型。
结论:
1. 不同类型的数据如果需要相互转换,尽量要做到显示的转换,这也会增加代码的可读性;
2. 不同类型的数据之间的操作一定要特别特别小心;
3. 我们不是编译器开发者(实际上就算是编译器开发者也不见得了解编译器的所有特性),所以尽量不用编译器所赋予的隐含的技巧.
分享到:
相关推荐
C语言数据类型转换学习教案.pptx
C语言中数据类型转换及其应用探究.pdf
C语言中数据类型转换及其应用探究.pdf
C语言数据类型转换PPT学习教案.pptx
C语言数据类型转换.ppt
数据类型转换就是将数据(变量、表达式的结果)从一种类型转换到另一种类型。例如,为了保存小数你可以将int类型的变量转换为double类型。 数据类型转换的一般格式为: (type_name) expression type_name为要转换到...
C数据类型转换问题是很重要的问题,必需按计算顺序一步步进行,有的是自然的转型,有的需根据需要强制转换。
C语言数据类型转换ppt课件.ppt
论C语言教学中数据类型转换的问题
本文详细描述了C语言数据类型转换的方法和注意事项,具有实用价值。
C语言数据类型转换的探讨.pdf
本文通过一个编程实例解析了c语言中数组访问机制及强制转换操作。
C语言数据类型转换PPT课件.pptx
C语言中三种数据类型转换之比较
C语言数据类型转换的方式及常见问题探讨.pdf
(1)若运算数中有double型或float型,则其他类型数据均转换成double类型进行运算。 (2)若运算数中最长的类型为long型.则其他类型数均转换成long型数。 (3)若运算数中最长类型为int型,则char型也转换成int型进行运算...
3)C语言数据类型丰富,具有现代语言的各种数据类型,用户还能扩充它,实现各种复杂的数据结构,完成各种问题的数据描述。 4)C语言是一种结构化程序设计语言,层次清晰,便于按模块化方式组织程序,易于调试和维护。C...
数据类型转换 格式 各种数据类型 互相转换 vc C语言
c语言指针类型强制转换