强制类型转换和隐式类型转换|自定义类型转换语句__int64 d = *(__int64 *)&st的说明
1、强制类型转换和隐式类型转换
1.1
char
tt=-2;
unsigned int _%X=*((unsigned int *)&((int)tt)) ;
其中,
(int)tt这一步是强制类型,编译器会自动创建一个临时的int类型的变量(temp)来存放强制类型后的值,即上述语句实际变为:
unsigned int
_%X=*((unsigned
int *)&temp)
*((unsigned int *)&temp)表示将signed int类型的变量temp的数据按照unsigned int来解释读取而已,并未实际将signed int类型的变量st的数据转换成unsigned int数据类型格式的。也就是说,(unsigned int *)&temp表示将读取temp上sizeof(unsigned int)字节的原值数据,而*((unsigned int *)&temp)表示将temp上读取的sizeof(unsigned int)字节的原值数据存放到一个unsigned int数据类型的临时变量上,而float ft=*((unsigned int *)&temp) 表示将该unsigned int数据类型的临时变量的数据隐式类型转换为float数据类型格式。
参见:
附加:
filetime
st;
__int64 d = *(__int64 *)&st;
//因为filetime结构体中的两个变量是unsigned long类型的,而*(__int64 *)&st只是表示将unsigned long类型的变量st的数据按照__int64(=longlong)来解释读取而已,并未实际将unsigned long类型的变量st的数据转换成__int64(=longlong)数据类型格式的。
1.2
char
tt=-2;
上述这种初始化或是赋值时的叫隐式类型转换。
2、
为什么filetime数据类型的变量st可以通过如下方式正确读取其所要表示的数值:
__int64 d = *(__int64 *)&st?
因为st是filetime数据类型,而filetime结构体中的两个变量是unsigned
long类型的,只要其内的dwHighDateTime的最高位不为1,通过__int64 d = *(__int64 *)&st都可以正确读取st所要表示的数值存放到变量d中。为什么其内的dwHighDateTime的最高位不为1时才可以正确读取,这是因为__int64的最高位为符号位,故而其表示的整数数据范围为-(2^63-1)~(2^63-1),当dwHighDateTime的最高位为1时st所要表示的数值(st所要表示的数值为
ULONGLONG Ull;
Ull=dwHighDateTime
<< 32 + dwLowDateTime)超出了__int64的表示的整数数据范围。
附加:
__int64 d = *(__int64 *)&st;应该改为__int64 d =(__int64)st;不行,因为编译器一般只存在从基本数据类型到基本数据类型的类型转换函数,而像从复合数据类型到基本数据类型等的类型转换函数一般不存在,即编译器可能不存在从filetime结构体类型到__int64的类型转换函数。
参考:
typedef struct _FILETIME {
DWORD dwLowDateTime; ///64位的低32位
DWORD dwHighDateTime; ///64位的高32位
}FILETIME;
(typdefDWORD unsigned long)假设st变量是LARGE_INTEGER,则
变量st可以通过如下方式不能正确读取其所要表示的数值:
__int64 d = *(__int64 *)&st。
因为st是LARGE_INTEGER数据类型,而LARGE_INTEGER结构体中的两个变量是signed long类型的,若两个变量LowPart和HighPart的值为负整数(即LowPart、HighPart的最高位为1)时,先要对两个变量分别减1再取反获得signed
long类型的原码LowPart_YM和HighPart_YM,再LONGLONG(=__int64)
ll;
ll=HighPart_YM
<< 32 + LowPart_YM,最后对ll进行取得__int64类型的补码,即为__int64 d。
若两个变量LowPart和HighPart的值为正整数(即LowPart、HighPart的最高位不为1)时,通过__int64 d = *(__int64 *)&st都可以正确读取st所要表示的数值存放到变量d中。
若两个变量LowPart和HighPart的值为一正整数和一负整数,则st所要表示的数值也就不意义了。
st所要表示的数值大致表达式为:LONGLONG(=__int64) ll; ll=HighPart<< 32 + LowPart
即通过两个小范围表示的变量合起来表示一个更大范围的数据值。
参考:
typedefunion _LARGE_INTEGER{
struct{
LONG LowPart; ///64位整型数的低32位
LONG HighPart;/// 64位整型数的高32位
};
LONGLONG QuadPart; ///64位整型数
}LARGE_INTEGER;
- 上一篇: FILETIME, SYSTEMTIME 与 time_t 相互转换
- 下一篇: 字符串截取 c++