【发布时间】:2017-04-22 01:15:31
【问题描述】:
我快速浏览了 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 位有符号字符 -1 首先直接转换为 8 位无符号值,即二进制 11111111 或十进制 255,然后扩展为 32 位无符号整数,也得到 255 (0xff)。
2) 8 位有符号字符 -1 被有符号扩展为 32 位有符号整数,给出 0xffffffff 然后重新解释为 32 位无符号整数。
这里显然使用了第二种方式。但为什么会这样呢?在标准中,我找不到任何关于此的内容。它是特定于实现的吗?
EDIT:C++03第4章原文
标准转换是为内置类型定义的隐式转换。第 4 条列举了所有此类转换。标准转换序列是按以下顺序进行的标准转换序列:
- 从以下集合进行零次或一次转换:左值到右值的转换、数组到指针的转换和函数到指针的转换。
- 来自以下集合的零个或一个转换:整数提升、浮点提升、整数转换、浮点转换、浮点整数转换、指针转换、指向成员的指针转换,以及 布尔转换。
— 零个或一个资格转换。
请注意,保证顺序是 l 到右值的转换(等)发生在集合积分提升/转换之前,但这并不意味着积分提升必须在转换之前发生 - 它们只是在同一个集合中. 还是我的解释正确?
【问题讨论】:
-
您不能在同一个标准转换序列(“零或一”)内同时进行促销和转换。
char到unsigned int是一种积分转换。
标签: c++ implicit-conversion c++03