【问题标题】:size of a hex pattern in cppcpp中十六进制模式的大小
【发布时间】:2014-05-23 20:37:58
【问题描述】:

我有一个存储在变量中的十六进制模式,我怎么知道十六进制模式的大小是多少 例如。 --

#define MY_PATTERN 0xFFFF

现在我想知道 MY_PATTERN 的大小,以便在我的代码中使用。

sizeof (MY_PATTERN)

这给了我警告——“整数转换导致截断”。

我该如何解决这个问题?我应该怎么写?

图案的大小可以增加或减少,因此我无法对其进行硬编码。

【问题讨论】:

  • 那么0xFFFF的“大小”是多少?
  • 我怀疑警告来自您如何使用 sizeof() 表达式的结果,而不是表达式本身。
  • 模式允许的范围是多少?
  • 我可以计算人的尺寸!!!请完整阅读。稍后我可能会更改定义的模式,因此如果我使用 2 个字节之类的内容,然后 MY_PATTERN 变量将更改为 0xFFFFFFFF。那该怎么办?
  • 试试这个,没有警告:#include int main () { #define MY_PATTERN 0xFFFF size_t x=sizeof (MY_PATTERN); printf ("%u\n", x); }

标签: c++ hex sizeof


【解决方案1】:

别这样。

在 C++ 中没有 "hex pattern" 这样的东西。您实际使用的是integer literal。见段落"The type of the literal"。因此,sizeof (0xffff) 等于 sizeof(int)。不好的是:the exact size may vary.

从设计的角度来看,我真的想不出这样的解决方案可以接受的情况。您甚至没有从文字值派生类型,这也是一个可疑的问题,但至少是一个 typesafe 解决方案。值的大小主要用于直接使用内存缓冲区的操作,例如memcpy()fwrite()。以这种间接方式定义的大小会导致非常脆弱的二进制接口和维护困难。如果您在x86Motorola 68000 机器上编译程序并希望它们通过网络协议进行互操作,或者想在第一台机器上编写一些文件,然后在另一台机器上读取它们怎么办? sizeof(int) 第一个是 4,第二个是 2。会坏的。

相反,显式使用精确大小的类型,如 int8_t、uint32_t 等。它们在 <cstdint> 标头中定义。

【讨论】:

    【解决方案2】:

    这将解决您的问题:

    #define MY_PATTERN 0xFFFF
    
    struct TypeInfo
    {
        template<typename T>
        static size_t SizeOfType(T) { return sizeof(T); }
    };
    
    void main()
    {
        size_t size_of_type = TypeInfo::SizeOfType(MY_PATTERN);
    }
    

    正如 Nighthawk441 指出的那样,您可以这样做:

    sizeof(MY_PATTERN);
    

    只要确保在收到警告的地方使用 size_t 即可解决您的问题。

    【讨论】:

    • 为什么不直接分配 size_of_type = sizeof(MY_PATTERN)?
    • 这个结构的目的是什么?模板的目的是什么?这对于它的作用来说是一种复杂的方式,并且对于所有整数值,这将始终返回 sizeof(int),所以可能不是操作想要的?
    • 这就是为什么我不喜欢使用 #define 以及为什么我确保我使用 size_t 和 sizeof。
    【解决方案3】:

    您可以明确地 typedef 各种类型来保存大小受限的十六进制数字,例如:

    typedef unsigned char one_byte_hex;
    typedef unsigned short two_byte_hex;
    typedef unsigned int four_byte_hex;
    
    one_byte_hex pattern = 0xFF;
    two_byte_hex bigger_pattern = 0xFFFF;
    four_byte_hex big_pattern = 0xFFFFFFFF;
    
    //sizeof(pattern) == 1
    //sizeof(bigger_pattern) == 2
    //sizeof(biggest_pattern) == 4
    
    four_byte_hex new_pattern = static_cast<four_byte_hex>(pattern);
    //sizeof(new_pattern) == 4
    

    不管使用什么模式,将所有十六进制数字都视为无符号整数会更容易。

    或者,您可以组合一个函数来检查它可以将模式的位移动多少次,直到它为 0。

    size_t sizeof_pattern(unsigned int pattern)
    {
        size_t bits = 0;
        size_t bytes = 0;
        unsigned int tmp = pattern;
    
        while(tmp >> 1 != 0){
            bits++;
            tmp = tmp >> 1;
        }
        bytes = (bits + 1) / 8; //add 1 to bits to shift range from 0-31 to 1-32 so we can divide properly. 8 bits per byte.
        if((bits + 1) % 8 != 0){
            bytes++; //requires one more byte to store value since we have remaining bits.
        }
        return bytes;
    }
    

    【讨论】:

      猜你喜欢
      • 2013-10-30
      • 1970-01-01
      • 2011-12-09
      • 2011-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多