985得票11回答
严格别名规则是什么?

当谈到C语言中的常见未定义行为时,人们有时会提到严格别名规则。 他们在说什么?

327得票16回答
C和C++中联合体的目的

我以前使用联合体感到很自在;今天当我读到这篇文章后,我感到很震惊,因为我发现这段代码存在风险。union ARGB { uint32_t colour; struct componentsTag { uint8_t b; uint8_t...

115得票5回答
可以使用联合体进行类型转换吗?如果不行的话,为什么?

我已经搜索了一段时间,但找不到明确的答案。 很多人说使用联合类型转换是未定义的和不良的做法。为什么会这样呢?我看不出任何原因会导致未定义的行为,因为你写入原始信息的内存不会自己改变(除非它在堆栈上超出作用域,但这不是联合的问题,那将是糟糕的设计)。 人们引用了严格别名规则,但在我看来,这就...

113得票3回答
在Rust中编写Quake的快速InvSqrt()函数是否可行?

这只是为了满足我的好奇心。 这个有没有实现:float InvSqrt (float x) { float xhalf = 0.5f*x; int i = *(int*)&x; i = 0x5f3759df - (i>>1); x = *(floa...

70得票4回答
C99中是否未指定使用联合进行类型转换,并且在C11中是否已经被指定?

Stack Overflow上一个关于获取float类型的IEEE单精度位数的问题中,有很多回答建议使用union结构进行类型转换(例如:将float的位数转换为uint32_t):union { float f; uint32_t u; } un; un.f = your_f...

53得票9回答
解决解引用类型转换指针会破坏严格别名规则的问题

我正在尝试使用GCC编译一个特定程序时,修复两个警告。这两个警告是: 警告:解引用类型转换指针将破坏严格别名规则[-Wstrict-aliasing]。 这两个问题的罪魁祸首是:unsigned int received_size = ntohl (*((unsigned int*)dcc...

50得票2回答
在C++中,现代且正确的类型转换方式是什么?

看起来C++有两种类型。实用的C++和专业的C++。在某些情况下,将一种类型的位模式解释为另一种类型可能是有用的。浮点数技巧是一个显著的例子。让我们以著名的快速反平方根为例(取自Wikipedia,该页面又引用了here): float Q_rsqrt( float number ) { ...

46得票6回答
C#中的'unsafe'函数 — *(float*)(&result)与(float)(result)之间的区别

有人能简单地解释一下以下代码吗: public unsafe static float sample(){ int result = 154 + (153 << 8) + (25 << 16) + (64 << 24); ...

31得票8回答
如何正确地将浮点数和整数进行类型转换?

下面的代码通过一些比特操作执行快速反平方根运算。该算法可能是由Silicon Graphics在1990年代初开发的,它也出现在Quake 3中。更多信息 然而,我从GCC C++编译器得到以下警告:解引用类型转换后的指针将会违反严格别名规则。 在这种情况下,我应该使用static_cas...

29得票1回答
aligned_storage和严格别名问题

我目前正在使用aligned_storage实现类似于boost :: optional的“Optional”类型。为了实现这一点,我有一个类成员如下: typename std::aligned_storage<sizeof(T), std::alignment_of<T&gt...