jjzjj

c++ - ponter 和不同大小的整数类型之间的 reinterpret_cast

coder 2024-02-21 原文

当我们执行以下操作时实际发生了什么: 1)

int i = -1; // 32 bit
void *p;
p = reinterpret_cast<void*>(i) 

在 64 位架构上,sizeof(void*) == 8

2)

long long i; // 64 bit
void *p = (unsigned int)(-1);
i = retinterpret_cast<long long>(p) 

在 32 位架构上 sizeof(void*) = 4

我大体上知道结果是什么,但我希望有人用 C++ 标准来描述这个机制,以便更好地理解。

在第二种情况下,行为类似于“积分促销”(4.5) 中描述的行为(我将为 -1) 对于“int - unsigned long”的情况,我们通常会说指针像有符号整数一样转换吗?

3)

int i = ...;
unsigned long long L = ...;
i = L;

这里适用什么规则?

最佳答案

所有指针和整数类型之间的转换都是 实现定义。标准做的唯一保证 是这样的:

A value of integral type or enumeration type can be explicitly converted to a pointer. A pointer converted to an integer of sufficient size (if any such exists on the implementation) and back to the same pointer type will have its original value

然而,该标准确实做出了声明(在 非规范性说明):

It is intended to be unsurprising to those who know the addressing structure of the underlying machine.

从实现质量的角度来看,如果机器 具有线性寻址,将 int 转换为指针应该 产生一个对应于 int 值的值,如果 这个词(无论它的大小)被视为一个整体类型;在 换句话说,位模式没有改变。如果积分 类型较小,并且是负数,这是一个悬而未决的问题 它应该被符号扩展,或者剩余的位是否应该 设置为0。我更喜欢第二个,但我认为两者都可以 认为“不足为奇”。

从务实的角度来看:有大量的 那里的软件偶尔会抛出一个小的 void* 的非负整数值,并期望得到它 稍后带类型转换回来。正式地,取回它需要 首先转换为 intptr_t(或更大);否则代码 不应该编译。但我无法想象编译器会破坏它 除此以外。另一方面,对于负值,我会觉得 明显不太确定。我不确定有多小, 任何一个。 (我目前在一个特殊情况下使用该技术 值小于 40 或 50。我使用 MSC、g++ 和 Sun CC,至少,我无法想象它会在其他任何一个上失败 我过去使用过的主流 Unix 机器。但我不会 指望它在 16 位 Intel 或其他一些更奇特的 我见过的机器,当然不是在嵌入式系统上。)

最后,关于您的确切问题:可能会有所不同。我会试试 看,无论它做什么,都指望着这样一个事实 某处的一些代码依赖于它这样做,并且 供应商不会冒险改变行为。正式地,因为它是 实现已定义,实现者需要记录 它(当然,可以在下一个版本中更改它),但是 我通常发现很难找到这个 文档。

编辑:

我刚刚注意到你的最后一个问题涉及 unsigned long longint。这是一个整数转换,而不是 reinterpret_cast,因此适用不同的规则。或者更确切地说, 规则在不同的部分中指定:基本规则是 仍然是“实现定义”:

If the destination type is signed, the value is unchanged if it can be represented in the destination type (and bit-field width); otherwise, the value is implementation-defined.

C 标准在这里有些不同,因为它明确 允许引发实现定义的信号。 (它的 稍微延伸一下,说 C++ 中的“值” 标准可能是发出信号,即使这是 首选实现。)在实践中:所有的 我知道的编译器只会忽略额外的高位。

关于c++ - ponter 和不同大小的整数类型之间的 reinterpret_cast,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24551467/

有关c++ - ponter 和不同大小的整数类型之间的 reinterpret_cast的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  2. ruby-on-rails - Rails 应用程序之间的通信 - 2

    我构建了两个需要相互通信和发送文件的Rails应用程序。例如,一个Rails应用程序会发送请求以查看其他应用程序数据库中的表。然后另一个应用程序将呈现该表的json并将其发回。我还希望一个应用程序将存储在其公共(public)目录中的文本文件发送到另一个应用程序的公共(public)目录。我从来没有做过这样的事情,所以我什至不知道从哪里开始。任何帮助,将不胜感激。谢谢! 最佳答案 无论Rails是什么,几乎所有Web应用程序都有您的要求,大多数现代Web应用程序都需要相互通信。但是有一个小小的理解需要你坚持下去,网站不应直接访问彼此

  3. ruby-on-rails - 如何优雅地重启 thin + nginx? - 2

    我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server

  4. ruby - #之间? Cooper 的 *Beginning Ruby* 中的错误或异常 - 2

    在Cooper的书BeginningRuby中,第166页有一个我无法重现的示例。classSongincludeComparableattr_accessor:lengthdef(other)@lengthother.lengthenddefinitialize(song_name,length)@song_name=song_name@length=lengthendenda=Song.new('Rockaroundtheclock',143)b=Song.new('BohemianRhapsody',544)c=Song.new('MinuteWaltz',60)a.betwee

  5. ruby-on-rails - `a ||= b` 和 `a = b if a.nil 之间的区别? - 2

    我正在检查一个Rails项目。在ERubyHTML模板页面上,我看到了这样几行:我不明白为什么不这样写:在这种情况下,||=和ifnil?有什么区别? 最佳答案 在这种特殊情况下没有区别,但可能是出于习惯。每当我看到nil?被使用时,它几乎总是使用不当。在Ruby中,很少有东西在逻辑上是假的,只有文字false和nil是。这意味着像if(!x.nil?)这样的代码几乎总是更好地表示为if(x)除非期望x可能是文字false。我会将其切换为||=false,因为它具有相同的结果,但这在很大程度上取决于偏好。唯一的缺点是赋值会在每次运行

  6. ruby - 使用 `+=` 和 `send` 方法 - 2

    如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:

  7. HBase Region 简介和建议数量&大小 - 2

    Region是HBase数据管理的基本单位,region有一点像关系型数据的分区。region中存储这用户的真实数据,而为了管理这些数据,HBase使用了RegionSever来管理region。Region的结构hbaseregion的大小设置默认情况下,每个Table起初只有一个Region,随着数据的不断写入,Region会自动进行拆分。刚拆分时,两个子Region都位于当前的RegionServer,但处于负载均衡的考虑,HMaster有可能会将某个Region转移给其他的RegionServer。RegionSplit时机:当1个region中的某个Store下所有StoreFile

  8. [工业相机] 分辨率、精度和公差之间的关系 - 2

    📢博客主页:https://blog.csdn.net/weixin_43197380📢欢迎点赞👍收藏⭐留言📝如有错误敬请指正!📢本文由Loewen丶原创,首发于CSDN,转载注明出处🙉📢现在的付出,都会是一种沉淀,只为让你成为更好的人✨文章预览:一.分辨率(Resolution)1、工业相机的分辨率是如何定义的?2、工业相机的分辨率是如何选择的?二.精度(Accuracy)1、像素精度(PixelAccuracy)2、定位精度和重复定位精度(RepeatPrecision)三.公差(Tolerance)四.课后作业(Post-ClassExercises)视觉行业的初学者,甚至是做了1~2年

  9. java - 为什么 ruby​​ modulo 与 java/other lang 不同? - 2

    我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.

  10. ruby - 如何计算 Liquid 中的变量 +1 - 2

    我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我

随机推荐