>>>意思也就是编译器始终将十六进制看成是正数喽(signed int上限不够,但是可以将0xf0000000看成负数,下限够,却没有这样做)。
可以认为是正数>0。符号却和数字字面量有关。举例说,0x80000000是unsigned int,0x40000000是signed int 这是默认行为,很操蛋。
>>>虽然printf输出的是负值,但是那是库函数中的标准,默认是有符号的。
printf决定正负的是控制字符,%d是十进制decimal,记得前面说的工程背景,十进制是signed的吗?%u是无符号的。
>>>指定了十六进制的值,就是指定了存储形式,而不用关心它是有符号和无符号。对于单片机来说,我就是想明确地通过十六进制数来操作寄存器,那么十六进制数就可以不用(unsigned int)转换了吧。
存储形式是一定的,不随进制而变化:计算机里的数字是补码。xx进制,是给编译器识别的,实质都是那个数,只是表示法不一样,就像f(x),中间的x你换成y这个表示,不影响f这个函数的实质。
强制类型转化的明显化,是告诉编译器,告诉人,一个确定的类型。如上面说的,0x80000000是unsigned int,0x40000000是signed int,如此撕逼的行为你还希望你自己写程序的时候每一个都去核实吗?当做程序的时候,考虑程序的健壮和稳定,我们更期望类型的相容和匹配,一个不匹配的类型,往往很大程度上意味着一个潜在的错误。比如,int x = 0x80000000, if (x > 0)就是不成立的,而你不能要求大家伙在使用左边的声明时还要去看一下右边的数字具体量是有符号还是无符号。如果你的代码里统一成int x = (unsigned int)0x80000000,那么编译器就知道你的实际意图,它至少会给你一个警告提醒。
代码里做显示转化,是给自己一个摆脱编译器模糊的傻逼行为的机会。
|