Joh*_*zem 15 c language-lawyer
标准规定十六进制常量如0x8000(大于有符号整数)是无符号的(就像八进制常量一样),而像32768那样的十进制常量是长符号.(确切的类型假设一个16位整数和一个32位长.)但是,在常规C环境中,两者都具有相同的表示形式,二进制1000 0000 0000 0000.这种差异真的会产生不同的结果吗?换句话说,这种差异是否重要?
是的,这很重要.如果您的处理器具有16位int和32位long类型,则32768具有类型long(因为32767是符合有符号16位的最大正值int),而0x8000(因为它也被认为是unsigned int)仍然适合于16位unsigned int.
现在考虑以下程序:
int main(int argc, char *argv[])
{
volatile long long_dec = ((long)~32768);
volatile long long_hex = ((long)~0x8000);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
当考虑32768时long,否定将反转32位,从而产生具有类型的表示0xFFFF7FFF long; 演员是多余的.当考虑0x8000时unsigned int,否定将反转16位,导致表示0x7FFF类型unsigned int; 然后long,强制转换将零扩展到值0x00007FFF.请看H&S5,第24页第2.7.1节.
最好是增加与常数U,UL或L为合适.
| 归档时间: |
|
| 查看次数: |
4105 次 |
| 最近记录: |