4

我想知道值 0x7FFF 和 32767 之间有什么区别。据我所知,它们都应该是整数,唯一的好处是符号方便。它们将占用相同的内存量,并以相同的方式表示,或者还有其他原因选择将数字写成0xvs 以 10 为底的数字吗?

4

7 回答 7

10

唯一的好处是一些程序员发现在他们的头脑中更容易在基数 16 和二进制之间进行转换。由于每个基数 16 位恰好占据 4 位,因此更容易可视化位的对齐方式。并且以 2 为基数编写非常麻烦。

于 2013-01-04T01:18:34.523 回答
3

未修饰的十进制整数常量的类型始终是有符号的。当您达到由整数类型的宽度确定的各种边界值时,未修饰的十六进制或八进制常量的类型在有符号和无符号之间交替。

对于修饰为无符号的常量(例如0xFU),没有区别。

此外,不可能将 0 表示为十进制文字。

请参阅 C++11 中的表 6 和 C11 中的 6.4.4.1/5。

于 2013-01-04T01:16:20.020 回答
2

两者都是整数文字,只是提供了表示相同数字的不同方式。使用一种形式优于另一种形式没有技术优势。

请注意,您也可以使用八进制表示法(通过在值前面加上 0)。

于 2013-01-04T01:16:17.290 回答
2

0x7FFF 表示法比十进制表示法更清楚潜在的上溢/下溢。

如果您使用 16 位宽的东西,0x7FFF 会提醒您这样一个事实,即如果您以有符号方式使用这些位,那么对于正的有符号值,您将处于这 16 位可以容纳的最大值。加1,你就会溢出。

32 位宽也是如此。它可以容纳的最大值(有符号,正数)是 0x7FFFFFFF。

您可以直接从十六进制表示法中看到这些最大值,而您不能从十进制表示法中看到这些最大值。(除非你碰巧记得 32767 是 16 位的正符号最大值)。

(注意:如果 16 位保存有符号值,则当二进制补码用于区分正值和负值时,上述情况为真)。

于 2013-01-04T01:30:56.227 回答
1

一个是十六进制的——以 16 为底——另一个是十进制的?

于 2013-01-04T01:16:15.673 回答
0

这是真的,没有区别。任何差异都将存在于存储值的变量中。 文字 0x7FFF 和 32767 在各个方面都与编译器相同。

请参阅http://www.cplusplus.com/doc/tutorial/constants/

于 2013-01-04T01:16:23.193 回答
0

选择将 0x7fff 或 32767 写入源代码只是程序员的选择,因为这些值以相同的方式存储到计算机内存中。

例如:当我需要使用 4bit 而不是经典字节进行操作时,我会觉得使用 0x 表示法更舒服。

如果我需要提取 char 变量的低 4 位,我会这样做

res = charvar & 0x0f;

这与以下内容相同:

res = charvar & 15;

后者只是不太直观和可读,但操作是相同的

于 2013-01-04T01:32:23.423 回答