内存函数以及数据在内存中的存储
void*指针可以接收任意类型的地址
void*的指针(无具体类型的指针)不能进行直接运算,一般强制类型转换之后进行运算
强制类型转换只是临时的 比如:(char * *)dest++是不会按照char所占字节个数来+1的(这时候甚至会报错) 就算++放在前面,在有些编译器上也不行 但可以写为dest=(char ** )dest+1
C语言规定memcpy只要可以实现不重叠的拷贝就行了,但是VS上的memcpy可以实现重叠的拷贝,其他编译器不一定可以(memmove可以完全替代memcpy,自己用memmove)
把一个不受限制的地址交给一个受限制的地址时,编译器不会报警告
把一个受限制的地址交给一个不受限制的地址时,编译器会报警告
memset只能一个字节一个字节的改,所以发生了错误
右边的实体那个是地址中储存的补码的16进制
cahr类型数据的理解方法(取值范围是-128~127)(其他的可以类比)
%u直接打印补码 %d会认为首位的是符号位
打印时给有符号数不够的位补11111 给无符号数不够的位补0000(这个1和0是添加在符号位后面)(这个和%u还是%d无关)
关于多久用原码和补码:
1.打印方式和数值范围都没超出规定时,用平常运算就可以知道了,不需要用原码和补码啥的去理解
%x是以16进制的形式打印 ,但是打印时不会把0x打印出来(%#x的话,前面会有0x)
浮点数的存储,存储的就是S、M、E相关的值
浮点数在内存中是无法精确保存的(比如:8.8f 那个0.8就保存不精确,凑不齐)
浮点数在比较相等时,
有些是不能eg:
float f = 8.8;
if(f == 8.8)
....... 的
而是采用f-8.8的绝对值小于一个自己可以接受的精确度即可