将unsigned short *强制转换为unsigned int *

Kan*_*Kan 1 c++

我正在学习c ++,但对演员表有疑问。我有一个无符号的short *,我想将其转换为一个无符号的int *,但我没有相同的值,我想知道为什么。

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

所以我试图理解为什么!一个short是4个字节,一个int可以是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)
Run Code Online (Sandbox Code Playgroud)

结果是不同的……有人可以解释我为什么以及如何解决这个问题吗?

非常感谢,

Yak*_*ont 7

在C ++中将一种类型的指针转​​换为另一种指针,然后对其取消引用是“未定义的行为”;您将被禁止这样做并期望获得理智的结果。

在这种特定情况下,类型转换基本上是对指向的地址处的数据字节进行重新解释。从产生的机器代码的角度来看,问题是系统上int需要4个字节,而short只有2 个字节。因此您阅读了末尾的内容short并获得了垃圾数据。

还有比产生的机器代码,更高层次的问题(前述方式不确定的行为确实意味着“好,你读错了记忆”,这是一个温和的可能性;忠实地疯狂的事情都可能发生,包括时间旅行,这是不笑话)。但这足够了。

当您将实际值int转换为short(或等效的无符号数)时,该语言实际上会获取的内容short并将其扩展为int

有没有办法采取unsigned short*和,而无需创建一个独立的资源点,得到一个unsigned int*

C ++中的指针就像街道地址。一个int是办公楼,一个short是文房。如果您有平房的地址,并且在其上写下“这是一栋办公楼”,那么它就不是真的。当有人去平房盲目地使用电梯时,事情就变得混乱了

另一方面,如果您有一个平房并说“将其建在办公大楼中”(实际短缺是整数),则可以这样做。您将获得另一座建筑物(因为办公楼不适合平房使用),但它适合平房中的所有建筑物。