在C语言中将int转换为short

在C语言中将int转换为short,c,int,short,C,Int,Short,我有: 我得到b=-1,而我希望int32转换成int16(short)。我希望看到一些价值,而不是-1 请有人帮我解决这个问题。你的int A大于short的大小。将A转换为short时,在最左边的位中得到1,这表示它是一个负数。因为你得到了-1,我想你在所有16位中得到了1,这将给你-2^15+2^14+2^13…+2^0,这将为您提供-1。简而言之(没有双关语),如果整数太大,就不能将其转换为短整数 您的int A大于short的大小。将A转换为short时,在最左边的位中得到1,这表示它

我有:

我得到
b=-1
,而我希望
int32
转换成
int16
short
)。我希望看到一些价值,而不是
-1


请有人帮我解决这个问题。

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

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

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

在您的实现中,最后16位似乎是在转换为
short
时使用的。发生这种情况时,所有这些值都设置为
1
,从而表示为
-1

int a = 2147483647;
short b = (short)a;
但是,2个恭维表示和一般行为都不是C++标准的一部分,所以这个行为是实现定义的。

< P>值2147483647,或221-1溢出16位整数。其二进制表示在MSB中为0,在剩余位中为31

在您的实现中,最后16位似乎是在转换为
short
时使用的。发生这种情况时,所有这些值都设置为
1
,从而表示为
-1

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

但是,2个恭维表示和一般行为都不是C++标准的一部分,所以这种行为是实现定义的。

< P>这是<代码>实现定义的< /COD>行为,例如:代码> GCC < /Cord> >说:

对于转换为宽度N的类型,该值为约化模2^N,在该类型的范围内;没有发出任何信号

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

从C++标准草案中,部分<代码> 4.7积分转换< <代码>段落>代码> 3代码>代码>: 如果目标类型是有符号的,则如果可以在目标类型(和位字段宽度)中表示,则该值不变;否则,该值由实现定义

如果这是
未签名的
,那么您的行为就会非常明确,如第
2段所述:

如果目标类型是无符号的,则结果值是与源整数全等的最小无符号整数(模2n,其中n是用于表示无符号类型的位数)。[注:在2的补码表示中,这种转换是概念性的,位模式没有变化(如果没有截断)。-结束注]


该语言与标准草案第6.3.1.3节“有符号和无符号整数”中的C99类似,这是
实现定义的行为,例如
gcc
说明:

对于转换为宽度N的类型,该值为约化模2^N,在该类型的范围内;没有发出任何信号

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

从C++标准草案中,部分<代码> 4.7积分转换< <代码>段落>代码> 3代码>代码>: 如果目标类型是有符号的,则如果可以在目标类型(和位字段宽度)中表示,则该值不变;否则,该值由实现定义

如果这是
未签名的
,那么您的行为就会非常明确,如第
2段所述:

如果目标类型是无符号的,则结果值是与源整数全等的最小无符号整数(模2n,其中n是用于表示无符号类型的位数)。[注:在2的补码表示中,这种转换是概念性的,位模式没有变化(如果没有截断)。-结束注]

该语言与标准草案第6.3.1.3节“有符号和无符号整数”中的C99类似,当源值不适合目标类型时,将值转换为有符号类型将产生实现定义的结果。这意味着任何符合要求的编译器文档都必须记录该结果

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

32-bit int:   01111111111111111111111111111111
16-bit short: ----------------1111111111111111
实际上有未定义的行为。但在任何情况下,您都应该小心编写代码,以免引发此类问题。)

对于许多实现,无论是转换还是算术,目标为N位类型的溢出只会获取正确结果的N个低阶位

在您的例子中,
int
显然是32位,
short
是16位(这些大小在不同的实现中可能有所不同)
2147483647
0x7fffffff
,低位16位是
0xffff
,这也是(在您的实现中)type
short
-1
的表示形式

对于转换为无符号类型,结果由标准严格定义;它接受结果的低阶N位。和用于溢出浮点转换(sa
short b = (short)a;
short b = a;
uint32_t sum=0xFFFF1234;
uint16_t *p= (uint16_t *) &sum;
uint16_t checksum=p[0]; 
union ToShort
{
        uint32_t sum;
        uint16_t checksum[2];
} toShort;
toShort.sum=0xFFFF1234;
cout << hex << toShort.checksum[0];