[英]Program not recognizing the variable as long int nor as unsigned int
因为有符号的int溢出,所以我没有得到“ -2147483648”,而是得到了“ -2147483648”。 我尝试将变量声明为long int以及unsigned int都没有用。 它们只是不被识别为此类类型。 如果有人想知道,我就甩开了价值。
int multiplier = 1,i;
long int mpy = 0;
for(i=32;i>=0;i--){
mpy = 1 << multiplier++;
printf("mpy = %d\n",mpy);
}
由于常数1
是int
,因此当向左移动时,它仍然是int
。 如果您想要一个unsigned long long
,请这样:
unsigned long long mpy = 1ULL << multiplier++;
您可以将L
或UL
或LL
后缀之一用于long
, unsigned long
和long long
(以及它们的小写版本,但最好以大写形式写后缀,以免混淆l
和1
)。 选择取决于您真正要做什么。
请注意, <<
的结果类型是左侧操作数的类型。 移位结果仅随后转换为赋值运算符左侧的类型。 分配的LHS不会影响RHS值的计算方式。
正如user3528438在评论中指出的那样,并且我假设(可能是错误地)您会知道— multiplier
( <<
运算符的RHS)是负值还是等于或大于整数的位数。整数类型,然后调用未定义的行为。
请注意, long long
和unsigned long long
是十年半的旧标准(C99)和较新的C11标准的标准,但它们不是25世纪旧C89 / C90标准的一部分。 如果您停留在编译器处于时间扭曲状态的平台上(201x发行日期为1990年,C标准兼容性日期为1990年),则必须使用特定于平台的替代64位技术。 更新的问题中的循环包含33个值,因为您从32向下计数到0(包括0)。对于33个移位,每个32位类型都不会具有不同的值。
(高级用户可能对INT35-C感兴趣, 请使用正确的整数精度和N1899-整数精度位更新 ;对于大多数人来说,它们还是有点深奥的。我不确定是否会担心是否有必要担心这一点。提出的问题。)
还请注意以下注释中有关printf()
格式的讨论。 您应该确保以正确的格式打印该值。 对于long int
,应为%ld
; 对于unsigned long long
,这将是%llu
。 其他类型需要其他格式。 确保您使用的是明智的编译器警告选项。 如果您使用的是GCC,则应将gcc -Wall -Wextra -Werror -std=c11
视为一组相当有效的选项。 我使用比编译C代码时更严格的选项。
根据您使用的编译器以及以32位和64位模式进行编译,所看到的可能与预期的完全一样。
https://software.intel.com/zh-CN/articles/size-of-long-integer-type-on-different-architecture-and-os
tl; dr:对于MSVC, int
和long
均为32位,如果要存储更大的数字,则需要升级到__int64
。 在32位模式下使用gcc或其他编译器时,会遇到同一问题int
= long
= 32位,这对您的情况没有帮助。 只有当你迁移到64位编译非微软的编译器做的int
和long
开始出现分歧。
按注释部分编辑: int64_t
或long long
也是可以使用的符合标准的类型。 另外, unsigned
将允许发布者将其值调整为32位。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.