首页 > 试题广场 >

已知int占4个字节,bool占1个字节。 unsign

[单选题]
已知 int 4 个字节,bool 1 个字节。对于下面代码:
#include <iostream>
using namespace std;

int main(int argc, char** argv) {
    unsigned int value = 1024;
    bool condition = *((bool*)(&value));
    if (condition) value += 1; condition = *((bool*)(&value));
    if (condition) value += 1; condition = *((bool*)(&value));
}
value, condition 的结果为()
  • 1026, 1
  • 1025, 0
  • 1025, 1
  • 1024, 0
将1024化成十六进制为:0x0400
题中&value取地址相当于取首地址(低地址)

若数据是采用大端存储方式,则低地址对应的是数据的高位,即最左边的0.
则condition = 0,不执行两个if语句,则value不变,还是1024,

若数据是采用小端存储方式,则低地址对应的是数据的地位,即最右边的0.
则condition = 0,不执行两个if语句,value值还是1024.

所谓的大端存储,即低地址存放高位数据,高地址存放低位数据。
对应的小端存储,即低地址存放低位数据,高地址存放高位数据。

对于一个数据0x12345678,对应大小端存储方式如下:

小端存储方式
0x00    |78|
0x01    |56|        
0x02    |34|
0x03    |12|

大端存储方式
0x00    |12|
0x01    |34|        
0x02    |56|
0x03    |78|
注:
一个字节地址空间占8个位(bit),而一个十六进制数据位占4位(bit),
所以一个内存地址可以存两个十六进制数据位。

发表于 2019-06-27 22:20:43 回复(3)
unsigned int value = 1024;  
bool  *p = (bool *)(&value);  
for (unsigned int i = 0;i < sizeof(unsigned int);++i) 
    {
        cout << *(p + i) << endl;
    }

1024表示为十六进制是0x0400,
(bool *)(&value);取的是第一位的地址 condition取值为起始的高位字节(大端)/低位字节(小端),都是0。

编辑于 2020-08-05 16:18:11 回复(7)
个人认为,这里考的是堆栈地址生长的方向问题。而不是大小端的问题
发表于 2022-01-28 10:05:34 回复(0)
1024转化为16进制是0x00000400,&value取地址相当于取首地址,小端存储
0x00    |00|
0x01    |04|
0x02    |00|
0x03    |00|
大端存储
0x00    |00|
0x01    |00|
0x02    |04|
0x03    |00|
无论哪一种,&value取地址0x00,地址对应的值是00。
(bool *)(&value)是转化为bool类型的指针;
*((bool *)(&value))是去bool类型指针指向的值,也就是00。
发表于 2023-04-27 22:20:07 回复(0)
bool 取一个字节,只有0,1两张状态
发表于 2022-03-12 17:05:07 回复(0)
bool为一个字节,所以截取8bit
发表于 2021-08-10 16:28:56 回复(0)
1024的二进制为0000 0010 0000 0000,不管采取大端还是小端的一个字节,进行bool转换,都是0。故答案为d
发表于 2020-05-04 16:29:42 回复(2)