c - 整数常量的无符号类型
问题描述
我对整数常量的类型感到困惑,如下所述:
在第一行,如果一个常量以没有. 结尾'u'
,为什么十进制常量必须是signed
类型,而八进制或十六进制常量可以是unsigned
类型?
我认为如果signed
版本不适合将常量作为无符号版本有问题,例如:
long long l1 = 0xffffffff + 0xffffffff; // 0xffffffff is unsigned int
long long l2 = 4294967295 + 4294967295; // 4294967295 is signed long
l1 是 fffffffe,而 l2 是 1ffffffffe。显然 l1 是错误的
解决方案
如果我要说,我会回答十六进制和八进制数字比十进制数字更接近地表示位模式,因此 C 标准委员会决定即使没有U
后缀,十六进制和八进制数字也可能是无符号的。
想想有多少人会写这样的代码:
uint32_t b = a & 0xFFFFFFF0;
uint32_t b = a & 4294967280; // or -15?
推荐阅读
- python - 我们可以将 Databricks 输出传递给 ADF 作业吗?
- java - 等待元素的可见性
- whitespace - antlr 语法:仅在模板字符串中允许空格匹配
- php - 数组替换问题
- java - 如何更改 Gradle 缓存目录的位置?
- git - 需要 sudo 时执行“git pull”
- axapta - ax2012 r3 中的复制注释功能
- xamarin.forms - 页面中未显示不同的 png 图像
- visual-studio-code - 在已安装 Visual Studio 2017 的地方安装 twisted 需要 Microsoft Visual C++ 14.0
- r - 如何使用 R 按函数舍入特定列?