运行结果:
ffff
ffffffff
ffffffff
ffffffffffffffff
ULONG g_ulA = (ULONG)-1L
ULONG g_ulA = ~0UL
整型提升(intergral promotion)
某些运算符会对操作数进行整型提升
#include运行结果:int main() { unsigned short usData = 0; if (~usData > (unsigned short)0) { printf ("TRUE\n"); } else { printf("FALSE\n"); } }
FALSE
"~"会对操作数做“整型提升”,USHORT 提升为INT变为有符号类型,取反后为四字节全F(-1<0)
不要让UCHAR , USHORT,直接进行“~”, << >>也有类似问题
算术类型转换
当运算符的操作数类型不一致时,运算前会将操作数转换为同一类型
原则:
1、长度不同,往更大长度的类型转换
2、长度相同,往无符号类型转换
long double > double > float > unsigned long > long > unsigned int > int
扩展
从一个较小的数据类型转换到一个较大的类型
要将一个无符号数转换为一个更大的数据类型,只要简单地在表示的开头添加0。这种运算被称为零扩展(zero extension)
要将一个二进制补码数字转换为一个更大的数据类型,规则是执行一个符号扩展(sign extension),在表示中添加最高有效位的值。
#include运行结果:int main() { int val = -12345; short sx = val; unsigned short usx = sx; int x = sx; unsigned int ux = sx; printf("%10d %#10hx\n", sx, sx); printf("%10u %#10hx\n", usx, usx); printf("%10d %#10x\n", x, x); printf("%10u %#10x\n", usx, usx); }
-12345 0xcfc7
53191 0xcfc7
-12345 0xffffcfc7
53191 0xcfc7