• 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;

  • 相关阅读:
    @Value注解读取配置,给静态变量赋值
    SpringBoot中非Controller类调用service方法出现null空指针
    nacos多环境配置
    spring项目将配置迁移至nacos
    链表的翻转(java)
    java.lang.IllegalAccessError: tried to access method org.apache.poi.util.POILogger.log from class org.apache.poi.openxml4j.opc.ZipPackage
    SQL SERVER 存储过程将SELECT 数据集赋值给新表某个字段
    SQLServerException:将截断字符串或二进制数据
    获取mysql数据库表表头所有字段
    软工实践个人总结
  • 原文地址:https://www.cnblogs.com/cnlixl/p/3320434.html
Copyright © 2020-2023  润新知