用无符号数输出,为什么答案是4294967295,char只有一个字节,int 4个,到底是怎么存储的啊
答案:4 悬赏:50 手机版
解决时间 2021-02-03 07:05
- 提问者网友:心如荒岛囚我终老
- 2021-02-02 18:13
#includevoid main(){ char b=-257; printf("%u",b);}
最佳答案
- 五星知识达人网友:逐風
- 2021-02-02 19:47
VC6下,结果4,294,967,295
-257
4字节的二进制表示
1111 1111 1111 1111 1111 1110 1111 1111
由于char只有1字节,所以只存储低八位的数据
也就是
1111 1111
然后你又要以无符号整型输出,由于最高位为1,char一般编译器是做signed char处理的,所以高位扩展的话,就是
1111 1111 1111 1111 1111 1111 1111 1111
32个1,对应的无符号数是4,294,967,295
但是如果代码改成
#include<stdio.h>
void main()
{
unsigned char b=-257;
printf("%u",b);
}
其结果就是255
为了让lz更好地理解,发个文章给lz,地址不能直接打在知道里,容易被HX,所以发到lz消息里了
-257
4字节的二进制表示
1111 1111 1111 1111 1111 1110 1111 1111
由于char只有1字节,所以只存储低八位的数据
也就是
1111 1111
然后你又要以无符号整型输出,由于最高位为1,char一般编译器是做signed char处理的,所以高位扩展的话,就是
1111 1111 1111 1111 1111 1111 1111 1111
32个1,对应的无符号数是4,294,967,295
但是如果代码改成
#include<stdio.h>
void main()
{
unsigned char b=-257;
printf("%u",b);
}
其结果就是255
为了让lz更好地理解,发个文章给lz,地址不能直接打在知道里,容易被HX,所以发到lz消息里了
全部回答
- 1楼网友:長槍戰八方
- 2021-02-02 22:41
这个是因为C语言编译中的字节对齐。
(假设int为4字节,char为1字节)
struct X { int a; char b; int c; };
printf("%d,", sizeof(struct X));
struct Y { int a; char b; int c; char d};
printf("%d\n", sizeof(struct Y));
这个代码会输出什么?
a) 9,10
b)12, 12
c)12, 16
答案是C,我想,你一定知道字节对齐,是向4的倍数对齐。
但是,你知道为什么要字节对齐吗?还是因为性能。因为这些东西都在内存里,如果不对齐的话,我们的编译器就要向内存一个字节一个字节的取,这样一来,struct X,就需要取9次,太浪费性能了,而如果我一次取4个字节,那么我三次就搞定了。所以,这是为了性能的原因。
但是,为什么struct Y不向12 对齐,却要向16对齐,因为char d; 被加在了最后,当编译器计算一个结构体的尺寸时,是边计算,边对齐的。也就是说,编译器先看到了int,很好,4字节,然后是 char,一个字节,而后面的int又不能填上还剩的3个字节,不爽,把char b对齐成4,于是计算到d时,就是13 个字节,于是就是16啦。但是如果换一下d和c的声明位置,就是12了。
完整文章参阅我的百度空间。下面&
- 2楼网友:神也偏爱
- 2021-02-02 22:19
这个是因为C语言编译中的字节对齐。
(假设int为4字节,char为1字节)
struct X { int a; char b; int c; };
printf("%d,", sizeof(struct X));
struct Y { int a; char b; int c; char d};
printf("%d\n", sizeof(struct Y));
这个代码会输出什么?
a) 9,10
b)12, 12
c)12, 16
答案是C,我想,你一定知道字节对齐,是向4的倍数对齐。
但是,你知道为什么要字节对齐吗?还是因为性能。因为这些东西都在内存里,如果不对齐的话,我们的编译器就要向内存一个字节一个字节的取,这样一来,struct X,就需要取9次,太浪费性能了,而如果我一次取4个字节,那么我三次就搞定了
- 3楼网友:污到你湿
- 2021-02-02 20:40
LZ 知道char类型是一个字节,那么即由8位
一个char类型对应能存储的值范围是-128~127
而char b = -257;//这样赋值的结果溢出,输出为2^32次方值,即为默认的无符号占四个字节的int类型所能存储的最大值。其和编译器对齐有关系
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯