我想知道这一点:当我尝试为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文字之间存在一些显着差异。
其中一些后果如下所述:
来自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上的整数转换规则 。
以上就是c/c++开发分享在C中键入文字数值的选择相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562442.html