相关疑难解决方法(0)

为什么0 <-0x80000000?

我有一个简单的程序:

#include <stdio.h>

#define INT32_MIN        (-0x80000000)

int main(void) 
{
    long long bal = 0;

    if(bal < INT32_MIN )
    {
        printf("Failed!!!");
    }
    else
    {
        printf("Success!!!");
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

条件if(bal < INT32_MIN )总是如此.这怎么可能?

如果我将宏更改为:

#define INT32_MIN        (-2147483648L)
Run Code Online (Sandbox Code Playgroud)

有谁可以指出这个问题?

c signed numeric-conversion numeric-limits

251
推荐指数
6
解决办法
2万
查看次数

为什么在32位机器中 - ( - 2147483648)= - 2147483648?

我认为问题是自我解释的,我想它可能与溢出有关,但我仍然不太明白.引擎盖下发生了什么?

为什么-(-2147483648) = -2147483648(至少在用C编译时)?

c 32-bit twos-complement

62
推荐指数
3
解决办法
1万
查看次数

C:将最小32位整数(-2147483648)转换为float给出正数(2147483648.0)

当我遇到一些我觉得奇怪的行为时,我正在研究一个嵌入式项目.我设法在键盘上重现它(见下文)以确认,但我的机器上没有任何其他C编译器可以在它们上进行尝试.

场景:我有一个#define32位整数可以容纳的最负值,然后我尝试使用它来与浮点值进行比较,如下所示:

#define INT32_MIN (-2147483648L)

void main()
{
    float myNumber = 0.0f;
    if(myNumber > INT32_MIN)
    {
        printf("Everything is OK");
    }
    else
    {
        printf("The universe is broken!!");
    }
}
Run Code Online (Sandbox Code Playgroud)

键盘链接:http://codepad.org/cBneMZL5

对我来说,看起来这个代码应该可以正常工作,但令我惊讶的是它打印出来The universe is broken!!.

此代码隐式地将其转换INT32_MIN为a float,但事实证明,这会导致浮点值为2147483648.0(正!),即使浮点类型完全能够表示-2147483648.0.

有没有人对这种行为的原因有任何见解?

代码解决方案:正如Steve Jessop在他的回答中提到的,limits.h并且已经stdint.h包含正确的(工作)int范围define,所以我现在使用这些而不是我自己的#define

问题/解决方案解释摘要:鉴于答案和讨论,我认为这是对正在发生的事情的一个很好的总结(注意:仍然阅读答案/评论,因为它们提供了更详细的解释):

  • 我使用C89编译器具有32位longS,SO大于任何值LONG_MAX且小于或等于ULONG_MAX随后L后缀的类型为unsigned long
  • (-2147483648L)实际上是-一个unsigned …

c floating-point int minimum long-integer

14
推荐指数
2
解决办法
4738
查看次数

大的负整数文字

在Visual Studio 2010上的以下程序

#include <iostream>
using std::cout;

int main()
{
    cout << -2147483646 << '\n';
    cout << -2147483647 << '\n';
    cout << -2147483648 << '\n';    // numeric_limits<int>::min()
    cout << -2147483649 << '\n';
    cout << -2147483650 << '\n';
    cout << "..." << '\n';
    cout << -4294967293 << '\n';
    cout << -4294967294 << '\n';
    cout << -4294967295 << '\n';    // -numeric_limits<unsigned int>::max()
    cout << -4294967296 << '\n';
    cout << -4294967297 << '\n';
}
Run Code Online (Sandbox Code Playgroud)

生成以下输出

-2147483646
-2147483647
2147483648
2147483647
2147483646
...
3
2 …
Run Code Online (Sandbox Code Playgroud)

c++

10
推荐指数
1
解决办法
2883
查看次数

C++整型常量的类型

根据MSDN(整数类型 - VC2008):

没有后缀的十进制常量的类型是int,long int或unsigned long int.可以表示常量值的这三种类型中的第一种是分配给常量的类型.

Visual C++ 2008上运行以下代码:

void verify_type(int a){printf("int [%i/%#x]\n", a, a);}
void verify_type(unsigned int a){printf("uint [%u/%#x]\n", a, a);}
void verify_type(long a){printf("long [%li/%#lx]\n", a, a);}
void verify_type(unsigned long a){printf("ulong [%lu/%#lx]\n", a, a);}
void verify_type(long long a){printf("long long [%lli/%#llx]\n", a, a);}
void verify_type(unsigned long long a){printf("unsigned long long [%llu/%#llx]\n", a, a);}

int _tmain(int argc, _TCHAR* argv[])
{
    printf("sizeof(int) %i\n", sizeof(int));
    printf("sizeof(long) %i\n", sizeof(long));
    printf("sizeof(long long) %i\n\n", sizeof(long long));

    verify_type(-2147483647);
    verify_type(-2147483648);

    getchar();
    return 0; …
Run Code Online (Sandbox Code Playgroud)

c++ types long-integer

3
推荐指数
3
解决办法
663
查看次数