强制类型转换和隐式类型转换|自定义类型转换语句__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;
上述这种初始化或是赋值时的叫隐式类型转换。
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如何转换为Time_t
- 强制类型转换和隐式类型转换|自定义类型转换语句__int64 d = *(__int64 *)&st的说明
- JS的类型转换,强制转换和隐式转换
- JS的类型转换,强制转换和隐式转换
- JavaScript强制类型转换和隐式类型转换
- Java的强制类型转换与隐式类型转换
- 强制的类型转换
- 强制类型的转换
- 自动类型转换和强制类型转换
- 类型转换&&类型强制转换
- 类型转换&&类型强制转换
- C#自定义类型强制转换
- 类的自动类型转换和强制类型转换
- 类的自动类型转换和强制类型转换
- php 的数据强制类型转换和默认类型转换
- java的自动类型转换和强制类型转换
- 类的自动类型转换和强制类型转换
- Java:自动类型转换和强制类型转换的规则
- 基本数据的自动类型转换和强制类型转换
- 如何实现广告图片总是显示在页面上方,并且随滚动条同步移动?
- iOS TableView 去掉多余行数、最后一行Cell系统分割线顶头
- 在普通的java工程中指定log4j配置文件的路径
- camera摄像原理之三:色温和自动白平衡
- (自用)Android 命名规范 (提高代码可以读性)
- 强制类型转换和隐式类型转换|自定义类型转换语句__int64 d = *(__int64 *)&st的说明
- 给view设置圆角
- Android-Volley网络请求流程图
- 日经社説 20150521 好循環促し中長期の成長基盤を固めたい
- 记一次内存优化的分享
- react 事件系统
- iOS 值得关注的开源项目
- Number of 1 Bits
- java 发送http请求