#include <stdio.h>
#include <stdlib.h>
void show_bytes(unsigned char *start, int len)
{
int i = 0;
for (; i < len; ++i)
printf(" %.2x", start[i]);
printf("\n");
}
int main(void)
{
int a = -1;
unsigned int b = 4294967295;
unsigned int c = -1;
printf("a = %d, a = %u\n", a, a);
printf("b = %d, b = %u\n", b, b);
printf("c = %d, c = %u\n", c, c);
show_bytes((unsigned char *)&a, sizeof(int));
show_bytes((unsigned char *)&b, sizeof(unsigned int));
show_bytes((unsigned char *)&c, sizeof(unsigned int));
exit(0);
}
a = -1, a = 4294967295
b = -1, b = 4294967295
c = -1, c = 4294967295
ff ff ff ff
ff ff ff ff
ff ff ff ff
- 等号的右值,不管多大,计算机都是能存下的,而且按照补码来存(位数依据等号左侧的主类型来定)。
- 数据主类型只是框出一块内存来截取这个数,能截多少截多少。
- 多余空间补0/补1
- signed、unsigned 压根就不影响内存存储数据,补码多少就多少,不管大小不管正负都是以补码形式来存储.
- signed unsigned只是在应用层体现出点作用
- %u %d 作用:当从内存中拿出一段数据时,%u%d会把内存中的一串数据取出来,在上层函数中做转化。
- c语言的比较大小是建立在相同性值之下的
- signed<>signed
- unsigned<>unsigned
- 或者通过默认强转后再比较
- 不管怎么弄,内存中无大小无正负之分,只有位数长短之分,都是上层函数再自娱自乐
- 上层函数作用:
- 把程序里的被(符号+长度)修饰的1/-1,算成补码
- 然后存到内存中
- 从内存中读出补码,然后根据数据类型(符好+长度),转成1/-1
- 计算机中有一套默认的自动强转优先级