将无符号short*强制转换为无符号int* 我正在学习C++,我有一个关于Cask的问题。 我有一个无符号的short*我想把它转换成一个无符号的int*但是我没有相同的值,我想知道为什么

将无符号short*强制转换为无符号int* 我正在学习C++,我有一个关于Cask的问题。 我有一个无符号的short*我想把它转换成一个无符号的int*但是我没有相同的值,我想知道为什么,c++,C++,当我将一个short转换为int(使用静态转换)时,我有相同的值,但它不适用于unsigned short*到unsigned int* 所以我试着去理解为什么! 短字符是4字节,整数可以是8、16或32。 那么指针每次都会深入内存? 但是为什么从short转换为int有效呢 unsigned short *a = something(); // something return me a unsigned short *a unsigned int *b = static_cast<u

当我将一个short转换为int(使用静态转换)时,我有相同的值,但它不适用于unsigned short*到unsigned int*

所以我试着去理解为什么! 短字符是4字节,整数可以是8、16或32。 那么指针每次都会深入内存? 但是为什么从short转换为int有效呢

unsigned short *a = something(); // something return me a unsigned short *a

unsigned int *b = static_cast<unsigned int *>(a); // I also tried with reintepret_cast

std::cout << *a << std::endl // (print me my first value)
std::cout << *b << std::endl // (print me a wrong value)
unsigned short*a=something();//某物返回给我一个未签名的短*a
无符号int*b=静态_转换(a);//我还尝试了Reinepret_cast

std::cout
unsigned short*
指向内存中包含类型为
unsigned short
的对象的位置。该内存位置不包含类型为
unsigned int
的对象。当一个对象不存在于尖的位置时,通过指针指向一种类型的行为通常是未定义的(对于某些类型有例外)。

< P>在C++中铸造一种指向另一种指针,然后取消引用是“未定义行为”;你不被允许这样做,并期待着理智的结果

在这种特定情况下,cast基本上是在指向的地址处重新解释数据字节。在生成的机器代码级别上,问题是
int
需要系统上的4个字节,而
short
只有2个字节;因此,您读取了
short
的末尾,并获取垃圾数据

在比机器代码更高的抽象上也存在问题(上述未定义的行为并不意味着“好吧,你读错了内存”,这是一种温和的可能性;真正疯狂的事情可能发生,包括时间旅行,这不是玩笑)。但这已经足够了

当您将实际的
int
转换为
short
(或无符号等效项)时,该语言实际上接受
short
的内容,并将其扩展以填充
int

如果不创建要指向的独立资源,就无法获取
无符号的short*
,也无法获取
无符号的int*

C++中的指针就像街道地址。一座

int
是办公楼,一座
short
是平房。如果你有一间平房的地址,你在上面乱写“这是一栋办公楼”,那就不是真的。当有人去平房盲目使用电梯时,一切都会发生

另一方面,如果你有一间平房,并说“把它建成一座办公楼”(把一个实际的缩写转换成int),那就可以做到。你会得到一个不同的建筑(因为办公楼不适合平房的地段),但它适合平房的所有东西


现在,通常允许您将指针转换为不太对齐的指针,只要在使用它们之前将指针转换回(!)

在某些狭窄的情况下,允许取消对指针的引用

  • char*
    可用于读取某些类型的“原始内存”(以及
    std::byte*
    等)
  • 写入这样的字节来复制一个对象,只有在它们“可复制性很低”的情况下才有效

  • 在某些情况下,指向一种类型前缀的指针可用于读取另一种类型

  • 这被称为“布局兼容”,规则比大多数人想象的更具体、更宽松。

    你不能将一个指针强制转换为另一个指针类型并期望它工作。指针指向无符号短路的内存位置。
    如果您需要强制转换,那么您必须将未签名的short从内存中取出,并将其放入另一个内存中

    // in main
    unsigned short *ptr_a = something(); // something return me a unsigned short *a
    
    unsigned int b = static_cast<unsigned int>(*ptr_a); // cast the object at a into an uint
    unsigned int ptr_b = b&; // get the address for the new object
    
    std::cout << *ptr_a << std::endl;
    std::cout << *ptr_b  << std::endl;
    

    unsigned short*
    转换为
    unsigned int*
    是危险的(ehem…未定义的行为)。为什么不
    (无符号整数)*a?这导致了一个简单的转换,这是受支持的。请注意,
    静态转换
    甚至不编译。“如何跨越此问题”没有问题,您无法通过随机代码并期望它工作。
    重新解释转换
    的名称相当糟糕。除非你真的知道你在做什么,否则它应该被称为“危险”
    只能是
    无符号int b=*ptr\u a。您在
    unsigned int ptr_b=&b;中也有一个输入错误我认为指出允许将指针解引用到不同类型(布局兼容类型、引用兼容类型)的场景也会有所帮助
    
    int* something() {
        // int a = 5;
        // BAD - DON'T DO THIS: return a&;
        int* a = new int;
        *a = 5;
        return a; // OK, but remember to delete
    }
    
    // in some function, eg. main
    unsigned short *ptr_a = something(); // something return me a unsigned short *a
    
    unsigned int *ptr_b = new int;
    *ptr_b = static_cast<unsigned int>(*ptr_a);
    
    std::cout << *ptr_a << std::endl;
    std::cout << *ptr_b  << std::endl;
    delete ptr_a;
    delete ptr_b;