Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C++ Why bitwise operator ~ on uint64_t and uint8_t return different types?

#include <stdio.h>
#include <iostream>

int main()
{
    using namespace std;
    uint64_t a = 3;
    if (uint64_t(~a) == (~a))
        cout << "right" << endl;//right
    else
        cout << "wrong" << endl;
    cout << sizeof(~a) << endl;//8

    uint8_t b = 3;
    if (uint8_t(~b) == (~b))
        cout << "right" << endl;
    else
        cout << "wrong" << endl;//wrong
    cout << sizeof(~b) << endl;//4
    getchar();
    return 0;
}

~uint8_t returns int value,but ~uint64_t returns uint64_t .

Is this undefined behaviour ?

like image 415
iouvxz Avatar asked Aug 25 '16 11:08

iouvxz


1 Answers

Posting from en.cppreference

The result of operator~ is the bitwise NOT (one's complement) value of the argument (after promotion).

Integral promotion is applied to char, short int etc (types narrower than int) and the result needs to be casted to destination type if destination is not int.

This is the reason for sizeof(~b) == sizeof(int) in your case.

like image 51
Mohit Jain Avatar answered Sep 21 '22 07:09

Mohit Jain