一、赋值、容量:
#include <stdio.h>
int main(void)
{
unsigned int a = -100;
printf("d:%d\tu:%u\tx:%x\t",a,a,a);
return 0;
}
d:-100 u:4294967196 x:ffffff9c
整数-100在C语言中默认为int类型,-100被拷贝到a所标注的空间中,在此过程中只关注内存容量的大小,而与数据类型无关。
1、赋值、解码
-100在计算机中以补码存储:1111 1111 1001 1100(为方便假设int是16位)
输出:
%d:补码编码进行解码(-1*10^15+1*10^14+1*10^13+1*10^12+1*10^11+1*10^10+1*10^9+1*10^8+1*10^7+1*10^4+1*10^3+1*10^2)
%u:无符号的十进制解码,正数权值进行组合(即:1*10^15+1*10^14+1*10^13+1*10^12+1*10^11+1*10^10+1*10^9+1*10^8+1*10^7+1*10^4+1*10^3+1*10^2)
%x:输出十六进制整数,能够输出内存中存储的原始数据
#include <stdio.h>
int main(void)
{
unsigned char a = 250;
printf("%d\n", a + 6);
a = a+6;
printf("%d\n", a);
return 0;
}
256
0
2、容量、截断
char的范围:0~255
a+6=256,超过了1B,但是a+6是int,空间时4B,所以输出256
a = a+6,a是char,256超过了1B,低位部分被拷贝给a,超过的高位部分被截断。
#include <stdio.h>
int main(void)
{
//大容量向小容量赋值
char a = 0x12345678;
printf("%d\t%u\t%x\n", a, a, a);
//小容量向大容量赋值
int c = 0x80000000;
unsigned long long d = c;
printf("%lld\t%llu\t%llx\n", d, d, d);
return 0;
}
120 120 78
-2147483648 18446744071562067968 ffffffff80000000
3、容量、截断、补值
大容量向小容量赋值:被截断,只有0x78被拷贝到a中
小容量向大容量赋值:c为4B,可是d为8B,c被拷贝到d,但是d的高位是补1还是补0呢?这里是补1,即小容量向大容量赋值高位补符号位的数字
二、unsigned/signed 运算
#include <stdio.h>
int main(void)
{
/*1四则运算*/
unsigned int a = -10;
unsigned int a1 = a*2;
unsigned int a2 = a/2;
printf("a1=%d\t%u\t%x\n",a1, a1, a1);
printf("a1=%d\t%u\t%x\n",a2, a2, a2);
/*2逻辑运算*/
int b = -10;
unsigned int c = 10;
if ( b<c )
printf("correct! b(-10)<c(10)\n");
else
printf("error! b(-10)>c(10)\n");
/*3位运算*/
int d = ~b;
printf("d=%d\t%u\t%x\n",d, d, d);
return 0;
}
a1=-20 4294967276 ffffffec
a1=2147483643 2147483643 7ffffffb
error! b(-10)>c(10)
d=9 9 9
1、 四则运算
-10:1111 1111 1111 0110(补码)(十六进制:0xfffffff6)
在进行运算时把-10的补码当成无符号数进行运算
a1=a*2:-10向左移一位,右边补一个0,变成:1111 1111 1110 1100
a2=a/2:-10向右移一位,左边补一个0,变成:0111 1111 1111 1011
当进行除以2向右移一位的操作后,左边补1还是补0,取决于数据类型是unsigned还是signed
2、逻辑运算
unsigned和signed 做逻辑运算时把int强制转换为unsigned int vbcx
3、位运算
直接对补码进行取反(不管正负),原值+取反后的值=-1
三、数据类型
数据:常量、变量(整数、浮点数)
1、整数:十进制、八进制、十六进制
char(1B) < short <= int <= long <= long long int <= 4B, long >= 4B
2、浮点数:float:4B double:8B
3、常量的类型通常由书写格式决定:
100为int
100L为long,为了可移植性,如果要用很大的数,最好加上后缀L
100.1为double
100.1f为float,浮点数一般用double,如果想用float,最好加上后缀f(float a = 1.1f;)