我刚问了这个问题,这让我想到是否有任何理由
1)为什么你会使用十六进制或八进制而不是十进制分配一个 int 变量和
2)不同的赋值方式有什么区别
int a=0x28ff1c; // hexideciaml
int a=10; //decimal (the most commonly used way)
int a=012177434; // octal
我刚问了这个问题,这让我想到是否有任何理由
1)为什么你会使用十六进制或八进制而不是十进制分配一个 int 变量和
2)不同的赋值方式有什么区别
int a=0x28ff1c; // hexideciaml
int a=10; //decimal (the most commonly used way)
int a=012177434; // octal
用十六进制编写时,您可能有一些更容易理解的常量。
例如,十六进制的位标志紧凑且易于理解(对于某些易于理解的值),因为直接对应 4 个二进制数字 => 1 个十六进制数字 - 因此,通常十六进制表示在您按位执行时很有用操作(例如掩蔽)。
以类似的方式,在某些情况下,整数可以在某些字段中进行内部划分,例如,颜色通常表示为 32 位整数,如下所示:(0xAARRGGBB
或0xAABBGGRR
);此外,IP 地址:点分表示法中的每一段 IP 都是“32 位整数”表示法中的两个十六进制数字(通常在这种情况下,unsigned
整数用于避免与符号位混淆)。
在我目前正在处理的一些代码中,对于图像中的每个像素,我都有一个字节用于存储“附件信息”;因为我必须存储一些标志和一个小数字,所以我使用最低有效的 4 位来存储标志,使用 4 个最高有效位来存储数字。使用十六进制符号可以立即编写适当的掩码和移位:byte & 0x0f
给我 4 个 LS 位作为标志,(byte & 0xf0)>>4
给我 4 个 MS 位(重新移位)。
除了IOCCC和 UNIX 权限掩码之外,我从未见过八进制用于任何其他用途(尽管在最后一种情况下它们实际上很有用,你可能知道你是否曾经使用过chmod
);可能它们包含在语言中是因为 C 最初是作为编写 UNIX 的语言而开发的。
默认情况下,整数字面量是 type 对不起,脑残。我现在检查了标准,它是这样的:int
,而十六进制字面量是 typeunsigned int
或更大,如果unsigned int
不足以容纳指定的值。因此,当将十六进制文字分配给int
一个隐式转换时(虽然它不会影响性能,但任何体面的编译器都会在编译时执行转换)。
u
总是有符号的;它们的类型是可以表示它们之间的最小的int
, long int
, long long int
;unsigned
类型;它们的实际类型是可以表示int
, unsigned int
, long int
, unsigned long int
, long long int
,之间值的最小类型unsigned long long int
。(C++11,§2.14.2,¶2 和表 6)
差异可能与重载决议1相关,但当您只是将文字分配给变量时,它并不是特别重要。不过,请记住,您可能有大于 an 的有效整数常量int
,即分配给 anint
将导致有符号整数溢出;无论如何,任何体面的编译器都应该能够在这些情况下警告您。
假设在我们的平台上整数是 2 的补码表示,int
是 16 位宽,long 是 32 位宽;假设我们有一个像这样的重载函数:
void a(unsigned int i)
{
std::cout<<"unsigned";
}
void a(int i)
{
std::cout<<"signed";
}
然后,调用a(1)
anda(0x1)
将产生相同的结果 ( signed
),但a(32768)
将 printsigned
和a(0x10000)
print unsigned
。
从可读性的角度来看,这很重要——你选择哪一个表达了你的意图。
如果您将变量视为整数类型,您知道,就像2+2=4
,您使用十进制表示。它直观且直接。
如果您将其用作位掩码,则可以使用六进制、八进制甚至二进制。例如,你会知道
int a = 0xFF;
将最后 8 位设置为1
. 你会知道的
int a = 0xF0;
是(...)11110000
,但你不能直接说同样的话
int a = 240;
虽然它们是等价的。这仅取决于您使用这些数字的目的。
好吧,事实是,无论您想要十进制,八进制还是十六进制都没有关系,它只是一种表示形式,并且为了您的信息,计算机中的数字以二进制形式存储(因此它们只是 0 和 1),您也可以使用它来代表一个数字。所以它只是表示和可读性的问题。
注意: 在一些 C++ 调试器中(根据我的经验),我分配了一个数字作为十进制表示,但在我的调试器中它显示为十六进制。
它类似于这种方式和整数的赋值:
int a = int(5);
int b(6);
int c = 3;
这完全取决于偏好,当它崩溃时,你只是在做同样的事情。有些人可能会选择八进制或十六进制来配合他们处理该类型数据的程序。