结论:
C语言中,因为计算机均采用补码形式进行存放,且运算时会进行自动类型转换,因此不论有符号数还是无符号数,在强制转换中均采用统一法则:
若被转换的数据类型低于int,则在转换时先自动转换为int型数据,然后再将int型转换为指定类型,即强制截断高位,若被转换数据类型等于int或unsigned int,则直接进行高位截断;
分析如下,以下分析假设以32位机作为平台:
1、数据类型低于int,先默认转换为int型,用符号位进行高位填充,正数用0进行填充,负数用1进行填充,再进行高位截断。如:
char(8位)类型的“-1”补码形式为, 1111 1111 ==> (-1)
运算时会自动转换为int(32位)类型 即 1111 1111 1111 1111 1111 1111 1111 1111 ==> (-1)
若将其强制转换为int(32位)类型,为 1111 1111 1111 1111 1111 1111 1111 1111 ==> (-1)
若将其强制转换为unsigned short(16位)类型,即 1111 1111 1111 1111 ==> (65535)
unsigned char(8位)类型的“255”补码形式为, 1111 1111 ==>(255)
运算时会自动转换为int(32位)类型 即 0000 0000 0000 0000 0000 0000 1111 1111 ==> (255)
若将其强制转换为int(32位)类型,为 0000 0000 0000 0000 0000 0000 1111 1111 ==> (255)
若将其强制转换为unsigned short(16位)类型,为 0000 0000 1111 1111 ==>(255)
2、数据类型等于int或unsigned int,则直接进行高位截断。如:
int(32位)类型的“-2”补码形式为, 1111 1111 1111 1111 1111 1111 1111 1110 ==> (-2),
若将其转换为char(8位)类型,即将高24位强制截断,则为, 1111 1110 ==> (-2)
若将其转换为unsigned char(8位)类型,即将高24位强制截断,则为, 1111 1110 ==> (254)
unsigned int(32位)类型的“4294967295”补码形式为, 1111 1111 1111 1111 1111 1111 1111 1111 ==> (4294967295)
若将其转换为char(8位)类型,即将高24位强制截断,为 1111 1111 ==> (-1)
若将其转换为unsigned char(8位)类型,即将高24位强制截断,为 1111 1111 ==> (255)
补充:
计算机中,正数的原码、反码、补码均相同,负数的补码为反码+1,为什么计算机中要采用补码形式存放可参考此博客https://blog.csdn.net/qq_41727218/article/details/79521759