C语言符号扩展

时间:2021-02-02 03:41:31

最近项目要求由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;