#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 计算机中有一套默认的自动强转优先级