NT uiB = (UINT)-1;
ULONG ulC = (ULONG)-1;
UINT64 uiD = (UINT64)-1;
printf("%hx\n%x\n%lx\n%llx\n", usA, uiB, ulC, uiD);
}
运行结果:
ffff
ffffffff
ffffffff
ffffffffffffffff
通过以下两种方式定义机器字长全F
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