我知道默认情况下十六进制数字是无符号的,但是如果我将其强制转换为有符号类型该怎么办?然后它们会延伸吗?
例如(在int为32位的系统上:]
signed long l = (signed long)0x81234567;
我有2个不同的基于GCC的编译器,它们在这里的行为不同。
摘自C17标准草案(6.3.1.3):
将整数类型的值转换为_Bool以外的其他整数类型时,如果该值可以用新类型表示,则该值将保持不变。
...
否则,将对新类型进行签名,并且不能在其中表示值;结果是实现定义的,还是引发实现定义的信号。
这就是为什么您的编译器的行为有所不同。有符号的long不能容纳该值的宽度,因此结果是实现定义的。如果该值只是小一点(小于2 ^ 31-1 == 0x7FFFFFFF == 2,147,483,647),它将被强制转换吗?通常,该值将保留。