Com*_*erd 1 c++ variables variable-assignment
我刚问了这个问题,它让我思考是否有任何理由
1)为什么要使用十六进制或八进制而不是十进制来分配一个int变量
2)不同的分配方式有什么区别
int a=0x28ff1c; // hexideciaml
int a=10; //decimal (the most commonly used way)
int a=012177434; // octal
Run Code Online (Sandbox Code Playgroud)
当用十六进制编写时,您可能会有一些更容易理解的常量.
例如,十六进制中的位标志是紧凑的并且容易理解(对于某些容易理解的值),因为直接对应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的语言开发的.
默认情况下,整数文字属于类型对不起,脑力.我现在检查了标准,它是这样的: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.(C++ 11,§2.14.2,2和表6)
差异可能与重载决策1有关,但是当您只是为变量分配文字时,它并不是特别重要.但是,请记住,您可能具有大于a的有效整数常量int,即赋值int将导致有符号整数溢出; 无论如何,任何体面的编译器都应该能够在这些情况下警告你.
假设在我们的平台上,整数以2的补码表示,int16位宽,长为32位宽; 假设我们有一个像这样的重载函数:
void a(unsigned int i)
{
std::cout<<"unsigned";
}
void a(int i)
{
std::cout<<"signed";
}
Run Code Online (Sandbox Code Playgroud)
然后,调用a(1)和a(0x1)将产生相同的结果(signed),但a(32768)将打印signed和a(0x10000)将打印unsigned.