在C中键入文字数值的选择

我想知道这一点:当我尝试为int变量(16位编译器,整数2个字节)分配一个整数值时,让我们说:

 int a; a=40000; 

不能用它将被截断的类型范围表示。 但我所看到的是a中的结果值是-25000(或某个接近数字)的位模式,这意味着编译器为十进制40000选择的二进制表示是无符号整数表示。 这提出了我的问题:编译器如何选择这个文字表达式的类型?

我猜它使用能够处理价值的类型,所需的存储空间更少。

这里的行为在C89和C99之间有所不同。

在C89中,十进制整数文字采用可以表示的第一种类型:

 int, long, unsigned long 

在C99中,十进制整数文字采用可以表示的第一种类型:

 int, long, long long 

对于您的特定代码段,它没有任何区别,因为40000保证适合长,但C89和C99文字之间存在一些显着差异。

其中一些后果如下所述:

http://www.hardtoc.com/archives/119

来自Kernighan&Ritchie ,附录A2.5.1(整数常数),第193页:

整数常量的类型取决于它的forms,值和后缀……如果它是unsuffixed和decimal,它具有这些类型中的第一个,其值可以表示为:int,long int,unsigned long int。

请注意,此答案仅与C89相关,因为“C编程语言”的第2版早于C99标准。

hex的40000是0x9C40。 请注意,此值的最高有效位为1(0x8000)。 假设有一个二进制补码表示,这意味着如果将0x9C40填入带符号表示,那么,通过从其余符号位减去符号位的值,您将获得0x1C40 – 0x8000 = -0x63C0 = -25536(基数为10)。

看看INT00-C。 了解您的实现和INT02-C 使用的数据模型 。 了解更多信息, 了解 CERT C安全编码标准Wiki上的整数转换规则 。