左移计数 >= 类型宽度
left shift count >= width of type
我知道这是以前在堆栈溢出上被问到的问题,但我已经尝试了所有建议的解决方案,但没有任何效果。我的问题很简单,我正在尝试定义一个unsigned long,它必须取允许的最大可能值。
#define SIZEOF_ULONG (sizeof(long) * 8);
#define LARGEST_VALUE (1ULL << ((SIZEOF_ULONG)-1));
其中ulong类型定义为unsigned long。我得到一个警告,左移计数>= type的宽度。我已经检查了64位机器上unsigned long的大小,它是8B。最后,我尝试用-m64标志编译,但都是徒劳的。
任何想法?
发生错误,因为您的宏包含分号。先修复这些错误,你的代码就可以编译了。
(我猜关于位移位的警告是发出的,因为编译器看到了1ull << 64; - 1
之类的东西。真正的错误是分号,但也会发出移位64位的警告。)
另外,请与类型一致。在简短的代码片段中,您混合了unsigned long, unsigned long (ULL
)和long.
我不知道为什么你需要做位移位方法。考虑简单地将一个非常大的-1转换为unsigned类型,如下面的LARGEST_VALUE_3
所示。我认为你要去LARGEST_VALUE_2
和LARGEST_VALUE_1
是完全错误的(但之前建议)。
#include <stdio.h>
#include <stdint.h>
typedef uint64_t ulong; /* Use of uint32_t, uint16_t, or uint8_t are recommended */
#define NUM_BITS (sizeof(ulong) * 8)
#define LARGEST_VALUE_1 (1ULL << (NUM_BITS-1)) /* This answer is wrong */
#define LARGEST_VALUE_2 ((1ULL << NUM_BITS)-1) /* This answer is sometimes correct (except when NUM_BITS is >= 64) */
#define LARGEST_VALUE_3 ((ulong)(-1LL)) /* This is a simple answer */
int main(int argc, char* argv[])
{
printf("Bits in ULONG %un", NUM_BITS);
printf("Large value 1 is %llun", LARGEST_VALUE_1);
printf("Large value 2 is %llun", LARGEST_VALUE_2);
printf("Large value 3 is %llun", LARGEST_VALUE_3);
return 0;
}
程序输出为:
Bits in ULONG 64
Large value 1 is 9223372036854775808
Large value 2 is 18446744073709551615
Large value 3 is 18446744073709551615
相关文章:
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- eigen :: llt&lt;eigen :: matrixxd&gt;具有不完整的类型
- 错误c++visual studio c2227左侧'->;Init';必须指向类/结构/联合/泛型类型