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