我想知道值 0x7FFF 和 32767 之间有什么区别。据我所知,它们都应该是整数,唯一的好处是符号方便。它们将占用相同的内存量,并以相同的方式表示,或者还有其他原因选择将数字写成0x
vs 以 10 为底的数字吗?
7 回答
唯一的好处是一些程序员发现在他们的头脑中更容易在基数 16 和二进制之间进行转换。由于每个基数 16 位恰好占据 4 位,因此更容易可视化位的对齐方式。并且以 2 为基数编写非常麻烦。
未修饰的十进制整数常量的类型始终是有符号的。当您达到由整数类型的宽度确定的各种边界值时,未修饰的十六进制或八进制常量的类型在有符号和无符号之间交替。
对于修饰为无符号的常量(例如0xFU
),没有区别。
此外,不可能将 0 表示为十进制文字。
请参阅 C++11 中的表 6 和 C11 中的 6.4.4.1/5。
两者都是整数文字,只是提供了表示相同数字的不同方式。使用一种形式优于另一种形式没有技术优势。
请注意,您也可以使用八进制表示法(通过在值前面加上 0)。
0x7FFF 表示法比十进制表示法更清楚潜在的上溢/下溢。
如果您使用 16 位宽的东西,0x7FFF 会提醒您这样一个事实,即如果您以有符号方式使用这些位,那么对于正的有符号值,您将处于这 16 位可以容纳的最大值。加1,你就会溢出。
32 位宽也是如此。它可以容纳的最大值(有符号,正数)是 0x7FFFFFFF。
您可以直接从十六进制表示法中看到这些最大值,而您不能从十进制表示法中看到这些最大值。(除非你碰巧记得 32767 是 16 位的正符号最大值)。
(注意:如果 16 位保存有符号值,则当二进制补码用于区分正值和负值时,上述情况为真)。
一个是十六进制的——以 16 为底——另一个是十进制的?
这是真的,没有区别。任何差异都将存在于存储值的变量中。 文字 0x7FFF 和 32767 在各个方面都与编译器相同。
选择将 0x7fff 或 32767 写入源代码只是程序员的选择,因为这些值以相同的方式存储到计算机内存中。
例如:当我需要使用 4bit 而不是经典字节进行操作时,我会觉得使用 0x 表示法更舒服。
如果我需要提取 char 变量的低 4 位,我会这样做
res = charvar & 0x0f;
这与以下内容相同:
res = charvar & 15;
后者只是不太直观和可读,但操作是相同的