繁体   English   中英

程序无法将变量识别为long int或unsigned int

[英]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);
}

由于常数1int ,因此当向左移动时,它仍然是int 如果您想要一个unsigned long long ,请这样:

unsigned long long mpy = 1ULL << multiplier++;

您可以将LULLL后缀之一用于longunsigned longlong long (以及它们的小写版本,但最好以大写形式写后缀,以免混淆l1 )。 选择取决于您真正要做什么。

请注意, <<的结果类型是左侧操作数的类型。 移位结果仅随后转换为赋值运算符左侧的类型。 分配的LHS不会影响RHS值的计算方式。

正如user3528438评论中指出的那样,并且我假设(可能是错误地)您会知道— multiplier<<运算符的RHS)是负值还是等于或大于整数的位数。整数类型,然后调用未定义的行为。

请注意, long longunsigned 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, intlong均为32位,如果要存储更大的数字,则需要升级到__int64 在32位模式下使用gcc或其他编译器时,会遇到同一问题int = long = 32位,这对您的情况没有帮助。 只有当你迁移到64位编译非微软的编译器做的intlong开始出现分歧。

按注释部分编辑: int64_tlong long也是可以使用的符合标准的类型。 另外, unsigned将允许发布者将其值调整为32位。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM