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