typedef signed short SIGNED_SHORT; //16 bit
typedef signed int SIGNED_INT; //32 bit
这些typedef
s 并不是特别有用。typedef 只是为现有类型提供一个新名称。类型signed short
已经有一个很好的名字:“ signed short
”;调用它SIGNED_SHORT
也不会给你带来任何东西。(如果它抽象出一些关于类型的信息,或者如果类型可能会改变,这将是有意义的——但是将名称SIGNED_SHORT
用于其他类型signed short
会非常混乱。)
还要注意short
和int
都保证至少为16 位宽,并且int
至少与 一样宽short
,但不同的大小是可能的。例如,编译器可以同时生成16 位short
和int
16 位 - 或 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
. 但是,如果您希望您的程序具有最大的可移植性,则不应依赖于此。