为什么这样呢?
unsigned char k=-1
if(k==-1)
Run Code Online (Sandbox Code Playgroud)
是假的
unsigned int k=-1
if(k==-1)
Run Code Online (Sandbox Code Playgroud)
是真的
int*_*jay 19
出于演示的目的,我们假设8位chars和32位ints.
unsigned char k=-1;
Run Code Online (Sandbox Code Playgroud)
k 被赋值为255.
if(k==-1)
Run Code Online (Sandbox Code Playgroud)
==操作员的左侧是unsigned char.右边是一个int.由于a的所有可能值unsigned char都适合于a int,因此左侧将转换为a int(这是由于整数促销执行,引用如下).这导致比较(255 == -1),这是错误的.
unsigned int k=-1
Run Code Online (Sandbox Code Playgroud)
k 被赋值4294967295
if(k==-1)
Run Code Online (Sandbox Code Playgroud)
这一次,左侧(unsigned int)不能适合int.标准说在这种情况下,两个值都转换为unsigned int.所以这导致比较(4294967295 == 4294967295),这是真的.
标准的相关引用:
整数促销:(C99,6.3.1.1p2)
如果int可以表示原始类型的所有值,则该值将转换为int; 否则,它将转换为unsigned int.
通常的算术转换:(6.3.1.8).
[对于整数操作数,]在两个操作数上执行整数提升.然后将以下规则应用于提升的操作数:
- 如果两个操作数具有相同的类型,则不需要进一步转换.
...
- 否则,如果具有无符号整数类型的操作数的秩大于或等于另一个操作数的类型的等级,则具有有符号整数类型的操作数将转换为具有无符号整数类型的操作数的类型.
...
| 归档时间: |
|
| 查看次数: |
477 次 |
| 最近记录: |