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位有符号整数.
上面的双重铸造如何以及如何做?
谢谢!
当你施放两次时,按顺序施放石膏.
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
否则,新类型将被签名,并且值无法在其中表示; 结果是实现定义的,或者引发实现定义的信号.
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,但可以有不同的大小.例如,编译器可以使双方short和int16位-或为此事64位.但是我会假设编译器的大小与你说的一样.
另外,signed short和short是相同类型的名称,原样signed int和int.
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)
给定系统的范围int和short数值,数学值45512不能用类型表示short.语言规则声明这种转换的结果是实现定义的,这意味着由每个实现决定结果是什么,并且它必须记录该选择,但是不同的实现可以以不同的方式执行.(其实这不是很原委;与1999 ISO C标准允许添加这种转换,以提高实现定义的信号,我不知道这是否任何编译器.)
这种转换最常见的语义是结果得到源值的低位.这可能会导致-20024赋值x.但是,如果您希望程序最大程度地可移植,则不应该依赖于此.
| 归档时间: |
|
| 查看次数: |
1603 次 |
| 最近记录: |