整数变量赋值的差异

时间:2012-12-30 14:17:56

标签: c++ variables variable-assignment

我刚问了这个question,它让我思考是否有任何理由

1)为什么要使用十六进制或八进制而不是十进制和

来分配一个int变量

2)不同的分配方式有什么区别

int a=0x28ff1c;  // hexideciaml
int a=10;        //decimal (the most commonly used way)
int a=012177434; // octal

4 个答案:

答案 0 :(得分:5)

  1. 使用十六进制编写时,可能会有一些更容易理解的常量。

    例如,十六进制中的比特标记是紧凑的并且容易理解(对于一些容易理解的值),因为存在直接对应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的语言而开发的。

  2. 默认情况下,整数文字的类型为int,而十六进制文字的类型为unsigned int或更大,如果unsigned int不足以容纳指定值。因此,当将十六进制文字分配给int时,会有一个隐式转换(尽管它不会影响性能,但任何体面的编译器都会在编译时执行转换)。抱歉,brainfart。我现在检查了标准,它是这样的:

    • 十进制文字,没有u后缀,总是签名;他们的类型是可以在intlong intlong long int之间代表他们的最小类型;
    • 不带后缀的八进制和十六进制文字也可以是unsigned类型;它们的实际类型是可以表示intunsigned intlong intunsigned long intlong long intunsigned long long int之间的值的最小值。< / LI>

    (C ++ 11,§2.14.2,¶2和表6)

    差异可能与重载分辨率 1 有关,但是当您只是为变量分配文字时,它并不是特别重要。但是,请记住,您可能具有大于int的有效整数常量,即分配给int将导致有符号整数溢出;无论如何,任何体面的编译器都应该能够在这些情况下警告你。


    1. 假设在我们的平台上整数是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)会打印signeda(0x10000)会打印unsigned

答案 1 :(得分:3)

从可读性的角度来看很重要 - 您选择哪一个表达您的意图。

如果您将变量视为整数类型,则可以使用小数表示,如2+2=4。它直观而直接。

如果您将其用作位掩码,则可以使用hexa,octal甚至二进制。例如,你会知道

int a = 0xFF;

将最后8位设置为1。你会知道

int a = 0xF0;

(...)11110000,但您无法直接对

说同样的话
int a = 240;

虽然它们是等同的。这取决于你使用的数字。

答案 2 :(得分:0)

事实上,如果你想要十进制,八进制或十六进制它只是一个表示并不重要,并且对于你的信息,计算机中的数字以二进制形式存储(所以它们只是0&#39; s和1&#39; s,你也可以使用它来代表一个数字。所以它只是一个代表性和可读性的问题。

注意: 在一些C ++调试器中(根据我的经验),我将一个数字指定为十进制表示,但在我的调试器中它显示为十六进制。

答案 3 :(得分:0)

它类似于以这种方式赋值和整数:

int a = int(5);
int b(6);
int c = 3;

这完全取决于偏好,当它崩溃时你只是在做同样的事情。有些人可能会选择八进制或十六进制来配合操作该类型数据的程序。