c - C 编译器无法识别 unsigned long
问题描述
在我的电脑上,long
最大值为9223372036854775807
. 但是,当我厌倦unsigned long
了更大的值时,编译器会抛出一个警告,说它需要被解释为unsigned long
当我已经将它定义为时。为什么会这样?
//assigning maximum value of a long integer. (No error)
long max_l = 9223372036854775807L;
//assigning an unsigned long integer.
unsigned long max_ul = 9223372036854775808L; //warning: integer literal is too large to be represented in a signed
//integer type, interpreting as unsigned [-Wimplicitly-unsigned-literal]
cc --version
Apple LLVM version 10.0.1 (clang-1001.0.46.4)
解决方案
这个整数常量:
9223372036854775808L
太大而无法存储在long
.
相反,使用:
9223372036854775808UL
unsigned long
这通过附加后缀来指定常量具有类型UL
或者只使用后缀U
:
unsigned long max_ul = 9223372036854775808U;
当整数常量具有后缀L
(或l
)时,编译器按以下顺序确定其类型:类型中的第一个
signed long
signed long long
在其中可以表示它的价值。该类型似乎与编译器建立的类型signed long
具有相同的整数表示。signed long long
所以类型signed long
和类型signed long long
都不能代表常量。常数对于这些类型来说太大了。但是与编译器建立的类型unsigned long
具有相同内部表示的类型可以表示常量。unsigned long long
还要注意 C 中没有负整数常量。例如,如果您将编写
int x = -1;
然后编译器将构造拆分-1
为两个标记:整数常量1
和一元运算符-
。
考虑以下演示程序
#include <stdio.h>
int main(void)
{
int a[] = { 0, 1, 2 };
int *p = a + 1;
printf( "p[-1] = %d\n", p[-1] );
printf( "-1[p] = %d\n", -1[p] );
return 0;
}
程序输出为
p[-1] = 0
-1[p] = -2
表达式-1[p]
与表达式不同(-1)[p]
。它被处理为-(1[p] )
等价于-p[1]
。
推荐阅读
- reactjs - 将记录添加到表单时,React js中的增量映射键
- java - 我想在使用自定义适配器的列表视图中插入地图片段
- c - 动态内存分配中的 C 程序错误
- javascript - 提高 else-if 链的性能
- javascript - JSON 对象访问值
- mysql - 在 Eclipse 中单击按钮时创建表
- sql - 是否有来自 Performance Insights 的 CloudWatch 警报和通知指标?
- c - 我可以映射长度大于文件大小的文件吗?
- android - 并非所有 CardViews 都被提升
- python - Selenium 无法在 python 中启用 javascript