LINUX.ORG.RU

Converting an «int» into a 64-bit integer causes sign extension


0

0

Дано:

int main ()
{
    int i = 10;
    int *q = new int [i];

    return 0;
}

компилятор Sun Sudio 12. Платформа x86_64. Команда CC -xport64=full, ворнинг на строку "int *q = new int [i]": Converting an "int" into a 64-bit integer causes sign extension.


main:
.L_y1:
        pushq   %rbp
.L_y2:
        movq    %rsp,%rbp
.L_y3:
        subq    $32,%rsp
.L1:
.L2:

/ File main.cpp:
/ Line 2
/ Line 3
        movl    $10, -8(%rbp)
/ Line 4
        movl    -8(%rbp),%eax
        cltq
        movq    %rax, %r8
        leaq    0(,%r8,4), %rdi
        movl    $0, %eax
        call    __1c2N6FL_pv_
        movq    %rax, %r8
        movq    %r8, -24(%rbp)
        movq    -24(%rbp), %r8
        movq    %r8, -16(%rbp)
/ Line 6
        movl    $0, -4(%rbp)
        jmp     .L3
        .align  4
/ Line 7
.L3:
        movl    -4(%rbp), %eax
        leave
        ret

Вопрос: компилятор прав? Почему gcc молчит? Как этот сановский компилятор получше заткнуть?

> Как этот сановский компилятор получше заткнуть?

наверное сделать unsigned int i = 10;

dilmah ★★★★★
()


по крайней мере для CPP98 new объявляется как:

--- cut ---
18.4.1 Storage allocation and deallocation
18.4.1.1 Single-object forms

void* operator new(std::size_t size) throw(std::bad_alloc);

1 Effects: The allocation function (3.7.3.1) called by a newexpression
(5.3.4) to allocate size bytes of storage suitably aligned to represent
any object of that size.
--- cut ---

std::size_t беззнаковый, int знаковый. на что и намекает в своем предупреждении компилятор. вполне резонно в принципе намекает.

выход: s/int/unsigned itn

// wbr

klalafuda ★☆☆
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.