对于int64, Int32的一点理解

基本概念

32/64 表示的是数字长度

int32_t 4byte * 8 = 32

表示范围是: -(231+1) ~ 231-1

uint32_t

表示范围是: 0 ~ 232-1

int64_t 8byte * 8 = 62

表示范围是: -(263+1) ~ 263-1

uint64_t

表示范围是: 0 ~ 264-1

进制转换

hex(10) = dec(16)

编译区别

cc -m32 a.cc cc -m64 a.cc

指针大小是不相同的64位下是8byte, 32位下是4byte.

原因:就是说,现代操作系统比较贴心,每个程序运行的时候都给你一个大大的独占的内存条,对于32位系统来说,给的内存条大小为232字节,也就是4GB 对于64位系统来说,给的内存条大小是264字节,也就是数不清的字节 当然不可能真给你这么大。策略是你用多少就给你多少 但是你仿佛有一个超大内存可以独霸 所有的指针都是存的这个超大内存的地址 自然,32位系统的指针是4字节,因为一共有232个格子嘛,4字节就是32位数,每个数对应一个格子,也就是存了32个01. 64位的话只是更多而已,依然是一一对应

数组与指针后移

假设T a[] = {}; 已知a地址为A a+1 的地址是—–> A + sizeof(T); // 此处是T而不是T*

补码反码表示

C中 ^表示异或计算 (不同为1,相同为0) ~表示按位取反 (计算机中求负数 = 取反+1) 如果出现要求返回是uint却返回了负数的情况,计算机会吧他取反+1当成uint来计算。 -8 = ~8 + 1 = 232 -1 -8 +1

关于所谓的符号位

    举例说明:
    比如一个一字节的数:
    0 ~ 0111 1111是正数,表示0~127
    1000 0000 ~ 1111 1111是负数,表示-128 ~ -1
    每个正数取反加一就是相应的负数
    -128比较诡异,因为没有对应的正数

    也就是说最高位是1表示正,是0表示负这个没错,但是具体求的时候,始终是取反+1