相关疑难解决方法(0)

C++中两个整数的乘法

我有一个非常基本的问题,但我不确定我是否理解这个概念.假设我们有:

int a = 1000000;
int b = 1000000;
long long c = a * b;
Run Code Online (Sandbox Code Playgroud)

当我运行此,c显示负值,所以我改变也ablong long,然后一切都很好.那么,为什么我必须改变ab,当其值在范围int和他们的产品被分配到c(这是long long)?

我正在使用C/C++

c++ int range long-integer

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

这对int64_t的处理是GCC和Clang的错误吗?

现在,你们中的一些人会想要大喊未定义的行为,但是有一个问题.该类型int64_t不是由C标准定义,而是由POSIX定义.POSIX将此类型定义为:

带符号的整数类型,宽度为N,无填充位和二进制补码表示.

它不会留下这个实现来定义,并且绝对不允许将它视为无界整数.

linux$ cat x.c
#include <stdio.h>
#include <stdlib.h>
#include <inttypes.h>

int stupid (int64_t a) {
  return (a+1) > a;
}

int main(void)
{
    int v;
    printf("%d\n", v = stupid(INT64_MAX));
    exit(v);
}

linux$ gcc -ox x.c -Wall && ./x
0
linux$ gcc -ox x.c -Wall -O2 && ./x # THIS IS THE ERROR.
1
linux$ gcc --version
gcc (Debian 4.9.2-10) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see …
Run Code Online (Sandbox Code Playgroud)

c linux gcc posix clang

5
推荐指数
2
解决办法
673
查看次数

标签 统计

c ×1

c++ ×1

clang ×1

gcc ×1

int ×1

linux ×1

long-integer ×1

posix ×1

range ×1