如果将类型转换为带符号,十六进制数字是否会扩展符号?

问题描述 投票:0回答:1

我知道默认情况下十六进制数字是无符号的,但是如果我将其强制转换为有符号类型该怎么办?然后它们会延伸吗?

例如(在int为32位的系统上:]

signed long l = (signed long)0x81234567;

我有2个不同的基于GCC的编译器,它们在这里的行为不同。

c
1个回答
1
投票

摘自C17标准草案(6.3.1.3):

将整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则该值将保持不变。

...

否则,将对新类型进行签名,并且不能在其中表示值;结果是实现定义的,还是引发实现定义的信号。

这就是为什么您的编译器的行为有所不同。有符号的long不能容纳该值的宽度,因此结果是实现定义的。如果该值只是小一点(小于2 ^ 31-1 == 0x7FFFFFFF == 2,147,483,647),它将被强制转换吗?通常,该值将保留。

© www.soinside.com 2019 - 2024. All rights reserved.