2

代码:

typedef signed   short  SIGNED_SHORT;   //16 bit
typedef signed   int    SIGNED_INT;     //32 bit


SIGNED_SHORT x;

x = (SIGNED_SHORT)(SIGNED_INT) 45512; //or any value over 32,767

这是我所知道的:

有符号 16 位:
有符号:从 -32,768 到 32,767
无符号:从 0 到 65,535

不要期望 45512xx声明的 16 位有符号整数那样适合。

上面的双重铸造如何以及做什么?

谢谢你!

4

4 回答 4

5
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非常混乱。)

还要注意shortint都保证至少为16 位宽,并且int至少与 一样宽short,但不同的大小是可能的。例如,编译器可以同时生成16 位shortint16 位 - 或 64 位。但我会假设您的编译器的大小与您所说的一样。

此外,signed shortshort是相同类型的名称,与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. 但是,如果您希望您的程序具有最大的可移植性,则不应依赖于此。

于 2012-08-15T00:26:08.360 回答
5

当您施放两次时,将按顺序应用施放。

int a = 45512;
int b = (int) a;
short x = (short) b;

由于 45512 不适short用于大多数(但不是全部!)平台,因此这些平台上的演员表溢出。这将产生一个实现定义的信号或产生一个实现定义的值。

在实践中,许多平台将结果定义为截断值,-20024在这种情况下就是如此。但是,有些平台会发出信号,如果未被捕获,可能会终止您的程序。

引文: n1525 §6.3.1.3

否则,新类型是有符号的,值不能在其中表示;结果是实现定义的,或者引发了实现定义的信号。

于 2012-08-15T00:19:16.350 回答
4

双重转换相当于:

short x = static_cast<short>(static_cast<int>(45512));

这相当于:

short x = 45512;

这可能会环绕 so xequals -20024,但从技术上讲,如果你的平台上的 short 的最大值小于 45512,它是实现定义的行为。文字45512的类型是int

于 2012-08-15T00:19:05.160 回答
2

您可以假设它进行了两次类型转换(尽管signed int并且int在 C 标准 IIRC 中仅分开一次)。

如果 SIGNED_SHORT 太小而无法处理 45512,则结果要么是实现定义的,要么会引发实现定义的信号。(在 C++ 中,只有前者适用。)

于 2012-08-15T00:12:58.200 回答