内存值就是0和1,只是存储内容,没有任何意义。
运算值是人针对整数赋予内存值的意义,人对内存的解读分有符号和无符号两种。
同类型的符号变化,内存值不变。改变运算值。例如u_char>char char>u_char
符号只有解读时(做运算时,显示时等)才发挥作用
同符号的类型降低,内存赋值,不够的空间截断,信息量都被改动了,运算值当然会变。short->char u_short->u_char
同符号的类型提升,内存赋值,未初始化的空间按符号位赋值(无符号的符号位按0),改变内存值,但不改变运算值 。char->short u_char->u_short
按符号位赋值的意义,char的最小值是0x80(-128),转成short后,变成0xff80(-128),值是相等的。同符号提升后值不变。0x81(-127) oxff81(-127)
类型提升的原则就是不改变运算值
总结:
1:转符号影响运算值,提升类型影响内存值(未初始化的内存按符号位赋值),降低类型影响信息量。
2:赋值操作就是找地方存东西,目的地小了就丢东西,目的地大了就填一下。
本着上面两点看问题:
无符号数提升类型转有符号数 :提升类型时未初始化空间置0,不影响有符号数的符号位,不改变运算值。
有符号正数提升类型转无符号数 :符号位为0,提升类型时未初始化空间置0,不改变运算值。
有符号负数提升类型转无符号数 :符号位为1,提升类型时未初始化空间置1,转无符号后运算值会变大。
类型提升是改变内存值的元凶,符号是改变运算值的元凶。
有符号的负数不要同时提升类型加转符号