gpt4 book ai didi

c++ - Signed Char 到 Unsigned Int 转换的标准 C++ 行为

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:51:10 32 4
gpt4 key购买 nike

我快速浏览了 C++03 标准,但仍然无法判断是否可以保证此行为:

signed char cNegOne=-1; //char is 8bits
unsigned int a=cNegOne; //int is 32 bits in my Windows system
printf("0x%x\n",a);

结果是:

0xffffffff

VC++ 在 32 位 Windows 中给出 0xffffffff。但我的假设是转换可能以两种方式发生:

1) 首先将 8 位有符号 char -1 直接转换为 8 位无符号值,即二进制 11111111 或十进制 255,然后扩展为 32 位无符号整数,也给出 255 (0xff)。

2) 8 位有符号字符 -1 有符号扩展为 32 位有符号整数,给出 0xffffffff,然后重新解释为 32 位无符号整数。

很明显这里用的是第二种方式。但为什么会这样呢?在标准中,我找不到任何关于此的内容。它是特定于实现的吗?

编辑:原文来自C++03 Chapter 4

标准转换是为内置类型定义的隐式转换。第 4 条列举了全套此类转换。标准转换序列是按以下顺序排列的标准转换序列:

— 以下集合中的零次或一次转换:左值到右值的转换、数组到指针的转换和函数到指针的转换。

——来自以下集合的零个或一个转换:整数提升、浮点提升、整数转换、浮点转换、浮点整数转换、指针转换、指向成员转换的指​​针,以及 bool 转换。

— 零个或一个资格转换。

请注意,保证顺序是 l 到右值的转换(等)发生在集合积分提升/转换之前,但这并不意味着积分提升必须发生在转换之前 - 它们只是在同一个集合中. 或者我的解释是否正确?

最佳答案

在 C 和 C++ 中执行整数运算时,第一步是整数提升。带符号的字符和短裤变成带符号的整数;无符号字符和短裤成为无符号整数。即使您将两个短裤相加也是如此:操作本身是对整数而不是短裤执行的。

因此,当您考虑整数转换时,请先考虑提升,然后是符号更改。在 C++ 标准中,这两个步骤被描述为一个步骤。也就是说,技术上不会发生单独的整体提升,但如果目标类型比源类型宽,则更改符号的效果与如果在符号更改之前显式提升会发生的效果相同。基本规则是结果必须是输入模 2^n,其中 n 是输出类型的位数。对于 -1 的输入和 32 位输出类型,这意味着 2^32 - 1 的输出。

关于c++ - Signed Char 到 Unsigned Int 转换的标准 C++ 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41011632/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com