常量32768和0x8000之间的类型区别可以有所不同吗?

Joh*_*zem 15 c language-lawyer

标准规定十六进制常量如0x8000(大于有符号整数)是无符号的(就像八进制常量一样),而像32768那样的十进制常量是长符号.(确切的类型假设一个16位整数和一个32位长.)但是,在常规C环境中,两者都具有相同的表示形式,二进制1000 0000 0000 0000.这种差异真的会产生不同的结果吗?换句话说,这种差异是否重要?

Joh*_*zem 7

是的,这很重要.如果您的处理器具有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,ULL为合适.

  • `void main`?你开玩笑的吧. (7认同)
  • @Fanael:对不起,是的,你是对的.谢谢你的纠正!+1但是在嵌入式系统中,我们经常使用`void`,因为没有环境可以返回`int`. (4认同)
  • @OliCharlesworth:严肃地说,我的建议是克服你的烦恼.`void main`是一个非常常见的错误 - 是的,在大多数情况下,它*是一个错误.它往往出现在新手问题中,新手通常使用托管实现.指出它是一件好事.(它通常表明程序员从一本应该更清楚的作者写的坏书中学到了.) (2认同)