核心内容摘要
谁在掌控AI芯片的命脉?全球半导体新金字塔格局解析
整数在内存中的存储我们知道整数的2进制表⽰⽅法有三种即原码、反码和补码有符号的整数三种表⽰⽅法均有符号位和数值位两部分符号位都是⽤0表⽰“正”⽤1表 ⽰“负”最⾼位的⼀位是被当做符号位剩余的都是数值位。
而正整数的原、反、补码都相同。
负整数的三种表⽰⽅法各不相同。
原码直接将数值按照正负数的形式翻译成⼆进制得到的就是原码。
反码将原码的符号位不变其他位依次按位取反就可以得到反码。
补码反码1就得到补码。
对于整形来说数据存放内存中其实存放的是⼆进制的补码其原因在于使用补码可以将符号位与数值位统一处理同时加减法也可以统一处理CPU只有加法器此外补码与原码相互转换其运算过程也是相同的这样就不需要额外的硬件电路。
大小端字节序和字节序判断当我们了解了整数在内存中的存储后我们观察一个细节int main() { int a 0x11223344; //在内存中观察到是以44 33 22 11 的形式存储的即低位字节内容存储到低地址高位字节内容存储到高地址 // 是为什么呢 //即涉及到存储顺序 return 0; }其实超过⼀个字节的数据在内存中存储的时候就有存储顺序的问题按照不同的存储顺序我们分 为⼤端字节序存储和⼩端字节序存储下⾯是具体的概念⼤端存储模式 是指数据的低位字节内容保存在内存的⾼地址处⽽数据的⾼位字节内容保存在内存的低地址处。
⼩端存储模式 是指数据的低位字节内容保存在内存的低地址处⽽数据的⾼位字节内容保存在内存的⾼地址处。
上述概念需要记住⽅便分辨⼤⼩端。
1设计一个程序来判断当前机器的字节序int check_sys()//判断字节序 { //if (*(char*)n
// return 1; //else //{ // return 0; //}//可读性高 int i 1; //分析如果是小端字节序那么1在内存中应该是 01 00 00 00 //如果是大端字节序那么在内存中应该是 00 00 00 01 //那么我们就可以取内存中第一个字节的地址解引用通过判断得到的数是0或者1来判断当前的字节序 return (*(char*)i);//优化版本可读性低 } int main() { int ret check_sys(); if (ret
printf(小端字节序\n); else printf(大端字节序\n); return 0; }
2练习考察数据在内存中的存储整型提升的运用练习
int main() { char a -1; signed char b -1; unsigned char c -1; printf(a %d, b %d, c %d, a, b, c);// -1 -1 255 return 0; }题解首先-1的原码 10000000000000000000000000000001反码 11111111111111111111111111111110补码 11111111111111111111111111111111当-1赋给变量a时会发生截断得到 11111111 --即在内存中存储的形式同理bc也是如此我们可以发现当数据类型相同时这里指都是char类型时不论是有符号数还是无符号数得到的都是 11111111而%d是以十进制的有符号整数形式打印的所以a,b,c都要整型提升最关键的是整形提升时就需用到是否为有符号数或无符号数由于a和b都是有符号字符所以整型提升是以符号位补充高位的--即 11111111111111111111111111111111 ----转为原码为10000000000000000000000000000001 --即-1而c是无符号数所以整数提升是高位补0即000000000000000000000000011111111而打印是是把他当作有符号数打印 即 255。
练习