PTT
Submit
Submit
选择语言
正體中文
简体中文
PTT
C_and_CPP
[问题] C的strict aliasing rule
楼主:
zzss2003
(brotherD)
2019-01-23 13:37:04
嗨,大家今天过的好吗?
网址: https://reurl.cc/nZnAe
里面的一小段程式码:
float funky_float_abs (float a)
{
unsigned int temp = *(unsigned int *)&a;
temp &= 0x7fffffff;
return *(float *)&temp;
}
取浮点数的绝对值
网址里面说这样写会出问题,因为用char*与void*以外的型别(以这例子: unsigned int)
拿位址(&a)会让pointer指到别的address上。
但我用TDM-GCC 4.9.2与ideone(gcc6.3)编译并没有出现问题
结果: https://ideone.com/HJ6qX0
因为stackoverflow的这篇文章是10年前,我在想这部分是不是后来在C standard有被修正
过,但是网络上找找不到相关资讯,故上来请教一下板友~
感恩感恩
作者:
samuelcdf
(温泉龟)
2019-01-23 14:48:00
#1CUzwZv7
请看本板讨论串, 以前我被电过 +_+我找了一下午, 也没有找到什么资讯, 不过我想这只是因为undefined behavior出来结果刚好跟我们想的一样而已
作者:
lovejomi
(JOMI)
2019-01-23 19:05:00
我比较想知道 乍看想法我都不会觉得有问题,该怎么知道这写法是很可能undefined behavior呢?
https://ideone.com/YKpnuL
请问这写法会有问题吗?假设是在little endian的机器上 我查了一下 转成uchar*没有违反 strict alias, 那这样可以吗?还是一样有问题
作者:
samuelcdf
(温泉龟)
2019-01-24 09:37:00
用union, char*, unsigned char*都可以
作者:
descent
(“雄辩是银,沉默是金”)
2019-01-24 16:21:00
可能你的 int, float 大小一样
作者: Sanvean
2019-01-25 22:27:00
手上有一个相反的例子
https://pastebin.com/Tf8Z4n2p
作者:
LPH66
(-6.2598534e+18f)
2019-01-26 14:31:00
strict aliasing rule 不是表示它真的指到别处了而是编译器会假设不同型态指标指的一定是不同物件利用这个假设来进行许多的最佳化这个是 C 语言标准给的自由空间那编译器在不同的最佳化层级下会不会用这条规则进行最佳化就要看各自编译器的设计了
作者:
IhateOGC
(我讨厌)
2019-01-31 11:24:00
这让我想到C++当C写的天兵
继续阅读
[问题] 初学 C++程式疑问
z115988
[问题] MFC 想要计时器功能,该如何实现呢?
james999
[问题] console无法正常显示中文
opp556687
[问题] 对字串的理解
timmy999
[问题] overload 和 function matching 的问题
s06i06
[问题] Leet Code第17题网络解答的2个问题
Dong0129
[问题] 关于SERVICE CONTROL 的问题
jay70120
Re: [问题] 类别跟循环加不加分号的问题
SeamusBerloz
[问题] 类别跟循环加不加分号的问题
me8z7gnk
[问题] Multimedia Timer 超时的问题
licheer
Links
booklink
Contact Us: admin [ a t ] ucptt.com