设为首页 加入收藏

TOP

C语言运算符(二)
2014-11-23 19:33:14 来源: 作者: 【 】 浏览:26
Tags:语言 运算
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

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C程序-进程内存结构分析 下一篇双堆求中位数及C实现

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: