我对以下2个代码片段有疑问.
我在64位机器(x86_64-linux-gnu)上运行此代码.我可以看到Val数据类型的值溢出unsigned integer.
#include<stdio.h>
main()
{
unsigned int Val = 0xFFFFFFFF-15, Val2 = 0xFFFFFFFF;
if (Val+16 < Val2)
{
printf("Val is less than Val2\n");
}
}
Run Code Online (Sandbox Code Playgroud)
如果数据类型unsigned char不溢出.
#include<stdio.h>
main()
{
unsigned char Val = 0xFF-15, Val2 = 0xFF;
if (Val+16 < Val2)
{
printf("Val is less than Val2\n");
}
}
Run Code Online (Sandbox Code Playgroud)
我有两个问题:
Val当数据类型是unsigned char时,值是否被提升为高数据类型?- 如果是,为什么它不能从32位升级到64位
unsigned long?
C11标准如下(C11 6.3.11p2.2):
如果a
int可以表示原始类型的所有值(由宽度限制,对于位字段),则该值将转换为int; 否则,它被转换为unsigned int.这些被称为整数促销.整数促销不会更改所有其他类型.
从而:
unsigned char将被提升 - 但是它是一个实现细节是否int可以代表所有的值unsigned char- 因此它可能会被提升到unsigned int这些平台上.你的不是那些平台之一,因此你的第二个比较是(int)Val + 16 < (int)Val2.
如引用段落的最后一句所述,a unsigned int永远不会被提升.由于算法是在第一个片段中对无符号整数进行的,因此结果0xFFFFFFFF - 15 + 16是0U在具有32位值无符号int的计算机上.
| 归档时间: |
|
| 查看次数: |
136 次 |
| 最近记录: |