强制类型转换和隐式类型转换|自定义类型转换语句__int64 d = *(__int64 *)&st的说明

来源:互联网 发布:记忆存在哪里知乎 编辑:程序博客网 时间:2024/06/06 02:23

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数据类型格式。

参见:

原码、补码说明以及char和unsigned char区别--最终版


附加:

filetime st;

__int64 d = *(__int64 *)&st;

//因为filetime结构体中的两个变量是unsigned long类型的,而*(__int64 *)&st只是表示将unsigned long类型的变量st的数据按照__int64(=longlong)来解释读取而已,并未实际将unsigned long类型的变量st的数据转换成__int64(=longlong)数据类型格式的。

FileTime如何转换为Time_t


1.2

char tt=-2;

unsigned int   _%X=tt;

上述这种初始化或是赋值时的叫隐式类型转换

2、

为什么filetime数据类型的变量st可以通过如下方式正确读取其所要表示的数值:

__int64 d = *(__int64 *)&st?

因为stfiletime数据类型,而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的意思相当于ULONGLONG  Ull;  Ull=dwHighDateTime <<  32  +  dwLowDateTime。

附加:

__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。

因为stLARGE_INTEGER数据类型,而LARGE_INTEGER结构体中的两个变量是signed long类型的

若两个变量LowPartHighPart的值为负整数(即LowPartHighPart的最高位为1)时,先要对两个变量分别减1再取反获得signed long类型的原码LowPart_YMHighPart_YM,再LONGLONG(=__int64)  ll;
  ll=HighPart_YM
<<  32  +  LowPart_YM,最后对ll进行取__int64
类型的补码,即为__int64 d

若两个变量LowPartHighPart的值为正整数(即LowPartHighPart的最高位不为1)时,通过__int64 d = *(__int64 *)&st都可以正确读取st所要表示的数值存放到变量d中。

若两个变量LowPartHighPart的值为一正整数和一负整数,则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如何转换为Time_t


0 0
原创粉丝点击