2009-08-14 63 views
2

我想了解一下这个:当我尝试将一个整数值分配给int变量(16位编译器,2个字节的整数)让我们说:类型选择在C字面数值

int a; 

a=40000; 

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

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

+1

一个好的编译器会发出在这种情况下的警告。 – 0x6adb015 2009-08-14 13:23:19

回答

2

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

在C89,十进制整数字面取第一这些类型在其中它可被表示的:

int, long, unsigned long 

在C99,十进制整数字面取第一这些类型在其中它可被表示的:

int, long, long long 

为特定的代码片断它没有什么区别,因为40000是保证适合在长,但也有C89和C99文字之间的一些差异显著。

其中的一些后果描述如下:

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

0

以十六进制表示的40000为0x9C40。注意这个值的最高有效位是1(0x8000)。假设有two's complement表示形式,这意味着如果您将0x9C40嵌入到有符号表示形式中,那么通过从其余符号位中减去该值,您将得到0x1C40 - 0x8000 = -0x63C0 = -25536(基数为10)。

查看CERT C安全编码标准维基上的INT00-C. Understand the data model used by your implementation(s)INT02-C. Understand integer conversion rules以获取更多信息。

+0

真实和相关,但我认为实际的问题是“编译器如何选择文字的类型”,而不是“当我从该类型分配给int时会发生什么”。 – 2009-08-14 13:41:26

2

Kernighan & Ritchie,附录A2.5.1(整数常数),对193:

恒定的类型整数 取决于其形态,价值和 后缀...如果它是无后缀和 十进制,它具有这些类型中的第一个 类型,其值可以是 表示:int,long int,unsigned long int。

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