C语言符号扩展


最近项目要求由Solaris 32-bit移植到Solaris 64-bit上。

为防止意料外的符号扩展发生,在扩展时需使用显示转换。

在此对c语言符号扩展规则总结如下。

1 使用"="进行类型转换时,符号扩展规则如下。

·"="右端为无符号类型,向高精度扩展时一直为无符号扩展。

例:unsigned int ui_a = 0x80000000;

long l_a = ui_a;

ui_a(32-bit unsigned int)向long(64-bit)转换时,ui_a转换为0x0000000080000000

(无符号扩展)

·"="右端为带符号类型,向高精度扩展时一直为有符号扩展。

例:int i_a = 0x80000000;

long l_a = i_a;

i_a(32-bit int)向long(64-bit)转换时,ui_a转换为0xFFFFFFFF80000000

(有符号扩展)

2 含有表达式的类型转换,规则如下。

1)首先,由于含有表达式,首先进行整型提升。

1). 只要一个表达式中用到了整型值,那么类型为char、short int活整型位域(这几者带符号或无符号均可)的变量,以及枚举类型的对象,都可以被放在这个整型变量的位置。
2). 如果1)中的变量的原始类型值域可以被int表示,那么原值被转换为int;否则的话,转为unsigned int。

2)然后按照上诉规则1("="类型转换),进行类型转换。

例如 unsigned int ui_b = 0x40000;

unsigned long ul_b = ui_b << 13;

ui_b << 13,整型提升发生,ui_b提升为int型,然后进行左移运算,

ui_b << 13计算结果为0x80000000(int),

然后由"="进行类型转换,0x80000000(int)带符号扩展为0xFFFFFFFF80000000然后将其赋值给ul_b;

优质内容筛选与推荐>>
1、运用Edraw为WPF应用程序嵌入Office文档的方法总结
2、英语----名词性从句的混合练习(下)
3、关于HashSet的equals和hashcode的重写
4、数据挖掘之聚类分析
5、mysql开启日志sql语句


长按二维码向我转账

受苹果公司新规定影响,微信 iOS 版的赞赏功能被关闭,可通过二维码转账支持公众号。

    阅读
    好看
    已推荐到看一看
    你的朋友可以在“发现”-“看一看”看到你认为好看的文章。
    已取消,“好看”想法已同步删除
    已推荐到看一看 和朋友分享想法
    最多200字,当前共 发送

    已发送

    朋友将在看一看看到

    确定
    分享你的想法...
    取消

    分享想法到看一看

    确定
    最多200字,当前共

    发送中

    网络异常,请稍后重试

    微信扫一扫
    关注该公众号