百科问答小站 logo
百科问答小站 font logo



共用体只能同时储存一个值吗? 第1页

  

user avatar   Kurenai_Misuzu 网友的相关建议: 
      

union 在标准 C 和标准 C++ 中行为不同。

C 的 union 中,若 union 在生存期内,则所有成员都同时处于生存期内,但可能有非法对象表示。这允许类型双关,即将一个位模式以多个类型解释。

C++ 的 union 中,同一时刻只有一个成员在生存期内,使用不同的成员读写一般是未定义行为。例外是若公共起始序列存在,且在生存期中的成员拥有公共起始序列,则可通过其他成员的公共起始序列读取。这实际上不允许类型双关。


严格来说题主的代码存在 UB ,不过考虑到不少编译器默认有允许类型双关的扩展,有时也可认为有确定结果并作出解释。


一般实现是 union 的每个成员对象存储都始于 union 存储的首字节。现在常见的 int 占 4 字节, double 占 8 字节。先写入 double 成员再写入 int 成员时,原先的 double 成员对象表示的高 4 字节未被覆盖( C 标准中是未指定的,实际上覆盖也得到允许)。而被覆盖的低位字节,在实现中正好对应 double 的低位尾数。

由于输出方式的设置,某些时候低位字节的改变恰好会被掩盖。这造成了你的 one4all 能同时存储 double 和 int 的错觉。

(参见 std::basic_ostream::operator<< - cppreference.comstd::num_put::put, std::num_put::do_putstd::basic_ios::init - cppreference.comstd::printf, std::fprintf, std::sprintf, std::snprintf


另外也有 NaN-boxing 这种技术能在浮点 NaN 值里放别的东西,不过这就和 union 没什么关系了。




  

相关话题

  C/C++中,int a=15;a储存在哪? 
  「C++ 早就过时了,大部分写工程不用 C++,学习这个语言只是为了竞赛」的观点是否正确? 
  C/C++编程有哪些没什么用,但让人不明觉厉又不至于太奇怪的写法? 
  程序员做到什么程度才不会被算作 API caller? 
  C++在面向对象编程中,非虚继承和非虚析构函数的存在是为了解决什么问题? 能否都用虚继承和虚析构函数? 
  C/C++中,设计的时候字符/字符串为什么要加引号? 
  请问学 C 有必要死磕指针吗? 
  c语言0xFFFF换成十进制不应该是65535吗? 
  C++ 的 switch 为什么不自动加 break? 
  无码编程的思想是否值得推行? 

前一个讨论
为什么不能取消学区房制度?
下一个讨论
为什么C++中virtual要翻译为虚函数?





© 2024-06-01 - tinynew.org. All Rights Reserved.
© 2024-06-01 - tinynew.org. 保留所有权利