我应该使用C中的十六进制数字格式来执行算术吗?
Should I use the hexadecimal number format in C to perform arithmetic?
我有一个关于有符号数和十六进制数及其在 C 中算术中的使用的问题。据我了解,有符号数通常能够存储比无符号数更小的数字。
例如,一个长度为32位的有符号整数,其最大值为2,147,483,647;而无符号 32 位整数的范围最大为 4,294,967,295。
在对最高可能值进行加法时,这些数字的值似乎溢出了:
printf("My integer: %i\n", 2147483647 + 1);
我得到的输出是:
My integer: -2147483648
但是,尽管存在这种溢出,但十六进制数字字符串表示形式对于加法运算而言似乎格式正确且正确。
printf("My hexadecimal: %#X\n", 0x7FFFFFFF + 0x1); // 2147483647 + 1 in Hex
我得到的输出是:
My hexadecimal: 0X80000000
我的问题是,执行这种类型的加法然后查看十六进制表示形式是否有好处?
乍一看,这种方法似乎可以让我们访问 32 位数字的整个范围以进行加法运算。任何想法或意见表示赞赏。干杯
有符号整数溢出 undefined behavior。这意味着您无法可靠地预测这样做时会发生什么。
也就是说,您在这里看到的是您的系统使用 2 的补码来表示有符号整数中的负值的说明。
虽然 2 的补码很常见,但并不普遍。有些系统可能会使用符号位。因此,为了获得最大的可移植性,您不应依赖此行为。
我有一个关于有符号数和十六进制数及其在 C 中算术中的使用的问题。据我了解,有符号数通常能够存储比无符号数更小的数字。
例如,一个长度为32位的有符号整数,其最大值为2,147,483,647;而无符号 32 位整数的范围最大为 4,294,967,295。
在对最高可能值进行加法时,这些数字的值似乎溢出了:
printf("My integer: %i\n", 2147483647 + 1);
我得到的输出是:
My integer: -2147483648
但是,尽管存在这种溢出,但十六进制数字字符串表示形式对于加法运算而言似乎格式正确且正确。
printf("My hexadecimal: %#X\n", 0x7FFFFFFF + 0x1); // 2147483647 + 1 in Hex
我得到的输出是:
My hexadecimal: 0X80000000
我的问题是,执行这种类型的加法然后查看十六进制表示形式是否有好处?
乍一看,这种方法似乎可以让我们访问 32 位数字的整个范围以进行加法运算。任何想法或意见表示赞赏。干杯
有符号整数溢出 undefined behavior。这意味着您无法可靠地预测这样做时会发生什么。
也就是说,您在这里看到的是您的系统使用 2 的补码来表示有符号整数中的负值的说明。
虽然 2 的补码很常见,但并不普遍。有些系统可能会使用符号位。因此,为了获得最大的可移植性,您不应依赖此行为。