c/c++语言开发共享将int转换为C中的short

我有:

int a = 2147483647; short b = (short)a; 

我得到b = -1而我希望int32转换为int16short )。 我希望看到一些价值而不是 -1

请有人帮帮我。

    你的int A大于short的大小。 将A转换为short时,最左边的位数为1,这表示它是负数。 因为你得到-1,我想你在所有16位中得到1,这将给你-2 ^ 15 + 2 ^ 14 + 2 ^ 13 … + 2 ^ 0,这将给你-1。 简而言之(没有双关语),如果它太大,则无法将整数转换为short。

    值2147483647或2 31 -1溢出16位整数。 其二进制表示在MSB中为零,其余位为31。

    看起来在您的实现中,最后16位是在转换为short 。 发生这种情况时,所有这些都设置为1 ,导致2的补码表示为-1

     32-bit int: 01111111111111111111111111111111 16-bit short: ----------------1111111111111111 

    但是,2-compliment表示和这种行为通常都不是C ++标准的一部分,因此这种行为是实现定义的。

    当源值不适合目标类型时,将值转换为有符号类型会产生实现定义的结果。 这意味着任何符合标准的编译器文档都必须记录结果。

    (这与算术运算符溢出时的行为不同。例如:

     int overflow = INT_MAX + 1; 

    实际上有未定义的行为 。 但在任何一种情况下,您都应该小心编写代码,这样就不会触发这种问题。)

    对于许多实现,对于转换和算术,目标是N位类型的溢出只是获取正确结果的N个低位。

    在您的情况下,显然int是32位而short是16位(这些大小可以根据不同的实现而变化)。 21474836470x7fffffff ,低16位是0xffff ,这是(在你的实现上)类型short-1的表示。

    对于转换为无符号类型,结果严格按标准定义; 它需要结果的低位N位。 对于溢出的浮点转换(例如,将非常大的double值转换为float ),行为是未定义的。

    到目前为止,C和C ++都是一样的。 但只是为了增加混乱,从1999标准开始,允许溢出的带符号转换来引发实现定义的信号。 C ++没有这个。 我不知道任何编译器实际上是这样做的。

    我希望看到一些价值而不是 -1

    -1 “某个值”。 您预期会有一些具体的价值吗?

    偶然:

     short b = (short)a; 

    演员是不必要的。 赋值,初始化,参数传递和return语句可以在没有强制转换的情况下在任何数字类型之间分配值。 隐式转换该值:

     short b = a; 

    这是implementation defined行为,例如gcc Integers Implementation document说:

    为了转换为宽度为N的类型,将值减去模2 ^ N以在该类型的范围内 ; 没有信号被提出。

    这可能因编译器而异,我无法为clangvisual studio挖掘类似的文档。

    从C ++标准草案第4.7 Integral conversions节“ 4.7 Integral conversions3段:

    如果目标类型是有符号的,如果它可以在目标类型( 和位字段宽度)中表示,则该值不变; 否则,该值是实现定义的

    如果这是unsigned那么根据第2段,您将拥有完美定义的行为:

    如果目标类型是无符号的,则结果值是与源整数一致的最小无符号整数(模2n,其中n是用于表示无符号类型的位数)。 [注意:在二进制补码表示中,此转换是概念性的,并且位模式没有变化(如果没有截断)。 – 尾注]

    C99草案标准第6.3.1.3 Signed and unsigned integers节中的语言类似于有6.3.1.3 Signed and unsigned integers

    你可以这样做:

     uint32_t sum=0xFFFF1234; uint16_t *p= (uint16_t *) ∑ uint16_t checksum=p[0]; 

    校验和是0x1234

    这是另一种方式:

     union ToShort { uint32_t sum; uint16_t checksum[2]; } toShort; toShort.sum=0xFFFF1234; cout << hex << toShort.checksum[0]; 

    输出是1234

      以上就是c/c++开发分享将int转换为C中的short相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/560739.html

      (0)
      上一篇 2021年1月28日
      下一篇 2021年1月28日

      精彩推荐