c语言数据类型底层原理,赋值、截断、补位的原理

一、赋值、容量: 

#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;)

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值