c语言方向变量,C语言,变量与内存

一、数在计算机中的二进制表示

符号位:最高位为符号位,正数该位为0,负数该位为1;

原码:原码就是符号位加上真值的绝对值, 即用第一位表示符号, 其余位表示值

反码:正数的反码是其本身;负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。

补码: 正数的补码就是其本身;负数的补码是在其原码的基础上, 符号位不变, 其余各位取反, 最后+1. (即在反码的基础上+1)。

正数的原码、补码、反码表示方法均相同,不需转换。

任何数值在内存中都是以补码的形式存储的。

正数的补码与原码相同。比如9的原码和补码都是1001。

负数的补码等于它正数的原码按位取反后再+1。

负数补码计算:

1> -10的二进制形式        :1000 0000 0000 0000 0000 0000 0000 1010 //原

2> 除符号位取反             :1111 1111 1111 1111 1111 1111 1111 0101 //反

3> 对取反后的结果+1      :1111 1111 1111 1111 1111 1111 1111 0110 //补

二、基本数据类型

in linux-32:

#include "stdafx.h"

#include

#include

#include

#include "t.h"

void f0(void);

typedef struct ds{

unsigned int ui;

int i;

int j;

long int li;

char c;

unsigned char uc;

short int si;

unsigned short int usi;

float f;

double d;

long double ld;

char data[];

}DST;

int t1(void)

{

f0();

DST* pdst = (DST*)malloc(sizeof(DST)+1000);

if(pdst == 0){

return -1;

}

memset(pdst, 0, sizeof(DST)+1000);

pdst->ui = 0xffffffff;

pdst->i = pdst->ui;

pdst->j = -2147483648;

pdst->li = -2147483648;

pdst->c = -1;

pdst->uc = -1;

pdst->si = -1;

pdst->usi = -1;

pdst->f = -1;

pdst->d = -1;

pdst->ld = -1;

printf("pdst->c addr = %08x

", &(pdst->c) );

printf("pdst->uc addr = %08x

", &(pdst->uc) );

printf("pdst->si addr = %08x

", &(pdst->si) );

printf("pdst->usi addr = %08x

", &(pdst->usi) );

printf("pdst->f addr = %08x

", &(pdst->f) );

printf("pdst->d addr = %08x

", &(pdst->d) );

printf("pdst->ld addr = %08x

", &(pdst->ld) );

free(pdst);

pdst = 0;

return 0;

}

void f0(void)

{

printf("in vs2010:

");

printf("sizeof(char) = %d

", sizeof(char));

printf("sizeof(int) = %d

", sizeof(int));

printf("sizeof(short int) = %d

", sizeof(short int));

printf("sizeof(long int) = %d

", sizeof(long int));

printf("sizeof(float) = %d

", sizeof(float));

printf("sizeof(double) = %d

", sizeof(double));

printf("sizeof(long double) = %d

", sizeof(long double));

}

85cf0f55919e119fa211d3b038b7297f.png

内存中的i是0xffffffff,

(1)转化为二进制   1111 1111 1111 1111 1111 1111 1111 1111

(2)发现是负数

(3)减一               1111 1111 1111 1111 1111 1111 1111 1110

(4)除符号位取反   1000 0000 0000 0000 0000 0000 0000 0001 ; 真值为-1

内存中的j是0x80000000,(最小的一个负值,暂时还不能理解,因为借了一位才能完成这换算,需33位,不知是不是因为cpu中的计算单元有33位以上寄存器。)

(1)转化为2进制, 1000 0000 0000 0000 0000 0000 0000 0000

(2)发现是负数

(3)减一            1 0111 1111 1111 1111 1111 1111 1111 1111

(4)除符号位取反1 1000 0000 0000 0000 0000 0000 0000 0000 ;真值为-231= -2147483648

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值