在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
,这也是(在您的实现中)typeshort
中-1
的表示形式
对于转换为无符号类型,结果由标准严格定义;它接受结果的低阶N位。和用于溢出浮点转换(sa
short b = (short)a;
short b = a;
uint32_t sum=0xFFFF1234;
uint16_t *p= (uint16_t *) ∑
uint16_t checksum=p[0];
union ToShort
{
uint32_t sum;
uint16_t checksum[2];
} toShort;
toShort.sum=0xFFFF1234;
cout << hex << toShort.checksum[0];