对于大于32,767的值,如何转换为"signed int"并返回"signed short"?

T.T*_*.T. 2 c c++ variables types casting

码:

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
Run Code Online (Sandbox Code Playgroud)

这就是我所知道的:

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

不要指望45512以适合x作为x被宣布为16位有符号整数.

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

谢谢!

Die*_*Epp 5

当你施放两次时,按顺序施放石膏.

int a = 45512;
int b = (int) a;
short x = (short) b;
Run Code Online (Sandbox Code Playgroud)

由于45512不适合short大多数(但不是全部!)平台,因此这些平台上的转换会溢出.这将引发实现定义的信号或导致实现定义的值.

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

引用: n1525§6.3.1.3

否则,新类型将被签名,并且值无法在其中表示; 结果是实现定义的,或者引发实现定义的信号.


Kei*_*son 5

typedef signed   short  SIGNED_SHORT;   //16 bit
typedef signed   int    SIGNED_INT;     //32 bit
Run Code Online (Sandbox Code Playgroud)

这些typedef并不是特别有用.typedef只是为现有类型提供新名称.类型signed short已经有一个非常好的名字:" signed short"; 这SIGNED_SHORT也称它为你买不到任何东西.(如果它抽象出关于类型的一些信息,或者类型可能会改变,那将是有意义的 - 但是使用SIGNED_SHORT其他类型的名称signed short非常混乱.)

还要注意,short并且int保证至少 16位宽,并且int至少与宽度一样宽short,但可以有不同的大小.例如,编译器可以使双方shortint16位-或为此事64位.但是我会假设编译器的大小与你说的一样.

另外,signed shortshort是相同类型的名称,原样signed intint.

SIGNED_SHORT x;

x = (SIGNED_SHORT)(SIGNED_INT) 45512; //or any value over 32,767
Run Code Online (Sandbox Code Playgroud)

强制转换指定转换为指定类型.两个演员指定两个这样的转换.该值45512将转换为signed int,然后转换为signed short.

常量45512已经是类型int(另一个名称signed int),所以最里面的演员是毫无意义的.(注意,如果int只有16位,那么45512将是类型long.)

将一个数值类型的值分配给另一个数字类型的对象时,该值将隐式转换为对象的类型,因此最外部的强制转换也是多余的.

所以上面的代码片段完全等同于:

short x = 45512;
Run Code Online (Sandbox Code Playgroud)

给定系统的范围intshort数值,数学值45512不能用类型表示short.语言规则声明这种转换的结果是实现定义的,这意味着由每个实现决定结果是什么,并且它必须记录该选择,但是不同的实现可以以不同的方式执行.(其实这不是原委;与1999 ISO C标准允许添加这种转换,以提高实现定义的信号,我不知道这是否任何编译器.)

这种转换最常见的语义是结果得到源值的低位.这可能会导致-20024赋值x.但是,如果您希望程序最大程度地可移植,则不应该依赖于此.