对于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