typedef signed short SIGNED_SHORT; //16 bit
typedef signed int SIGNED_INT; //32 bit
这些typedefs 并不是特别有用。typedef 只是为现有类型提供一个新名称。类型signed short已经有一个很好的名字:“ signed short”;调用它SIGNED_SHORT也不会给你带来任何东西。(如果它抽象出一些关于类型的信息,或者如果类型可能会改变,这将是有意义的——但是将名称SIGNED_SHORT用于其他类型signed short会非常混乱。)
还要注意short和int都保证至少为16 位宽,并且int至少与 一样宽short,但不同的大小是可能的。例如,编译器可以同时生成16 位short和int16 位 - 或 64 位。但我会假设您的编译器的大小与您所说的一样。
此外,signed short和short是相同类型的名称,与signed int和一样int。
SIGNED_SHORT x;
x = (SIGNED_SHORT)(SIGNED_INT) 45512; //or any value over 32,767
强制转换指定到指定类型的转换。两个强制转换指定了两个这样的转换。该值45512转换为signed int,然后转换为signed short。
常量45512已经是类型int(的另一个名称signed int),所以最里面的转换是相当没有意义的。(请注意,如果int只有 16 位,则45512类型为long。)
当您将一种数值类型的值赋给另一种数值类型的对象时,该值会隐式转换为对象的类型,因此最外层的强制转换也是多余的。
所以上面的代码片段完全等价于:
short x = 45512;
int给定系统上和的范围short,数学值45512不能用 type 表示short。语言规则规定这种转换的结果是实现定义的,这意味着由每个实现来确定结果是什么,并且必须记录该选择,但不同的实现可以以不同的方式进行。(实际上这还不是全部;1999 年的 ISO C 标准增加了对这种转换的许可,以引发实现定义的信号。我不知道有任何编译器会这样做。)
这种转换最常见的语义是结果获取源值的低位。这可能会导致值-20024被分配给x. 但是,如果您希望您的程序具有最大的可移植性,则不应依赖于此。