我应该在C中使用十六进制数字格式来执行算术运算吗?

时间:2016-07-07 18:39:28

标签: c hex integer-overflow twos-complement

我对有问题的数字和十六进制数以及它们在C中的算术中的使用有疑问。据我所知,有符号数通常能够存储比无符号数更小的数字。

例如,长度为32位的有符号整数的最大值为2,147,483,647;而无符号32位整数的范围最大为4,294,967,295。

在对最高可能值执行加法时,这些数字的值似乎会溢出:

in wordpress page use [special_function_shortcode]
and in php use
<?php echo do_shortcode('[special_function_shortcode]') ;?>

我得到的输出是:

printf("My integer: %i\n", 2147483647 + 1);

然而,尽管存在这种溢出,但十六进制数字串表示似乎格式正确并且对于加法操作是正确的。

My integer: -2147483648

我得到的输出是:

printf("My hexadecimal: %#X\n", 0x7FFFFFFF + 0x1); // 2147483647 + 1 in Hex

我的问题是,是否存在执行此类添加然后查看十六进制表示有益的任何情况?

乍一看,似乎这种方法可以让我们访问32位数的整个范围以进行加法操作。任何想法或意见表示赞赏。干杯

1 个答案:

答案 0 :(得分:2)

有符号整数溢出为undefined behavior。这意味着你无法可靠地预测当你这样做会发生什么。

话虽这么说,你在这里看到的是一个例证,你的系统正在使用2补码来表示有符号整数中的负值。

虽然2的补充非常普遍,但它并不普遍。有些系统可能会使用符号位。因此,为了获得最大的可移植性,您不应该依赖于此行为。