Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 将字符类型转换为长字符_C++_C - Fatal编程技术网

C++ 将字符类型转换为长字符

C++ 将字符类型转换为长字符,c++,c,C++,C,假设我有一个变量,一个 我想把这件事放到一个很长的时间里 long b; b = (long)a; b中的上3个字节是否保证为0?在我的设置中,它们是0,但我不确定这是否依赖于编译器。是的,即使没有强制转换,b也保证在此赋值后具有值0x1。C++中的赋值运算符通常是语义或值驱动的,它将复制值或状态,而不是预成型位拷贝,即使这两个有时是等价的,例如对于平凡类型。 在某些情况下,特别是由于运算符重载,情况可能并非如此。开发人员在设计新的类型时,强烈鼓励保持这个概念,但是粗心的程序员可能会为非基本类

假设我有一个变量,一个

我想把这件事放到一个很长的时间里

long b;
b = (long)a;
b中的上3个字节是否保证为0?在我的设置中,它们是0,但我不确定这是否依赖于编译器。

是的,即使没有强制转换,b也保证在此赋值后具有值0x1。C++中的赋值运算符通常是语义或值驱动的,它将复制值或状态,而不是预成型位拷贝,即使这两个有时是等价的,例如对于平凡类型。
在某些情况下,特别是由于运算符重载,情况可能并非如此。开发人员在设计新的类型时,强烈鼓励保持这个概念,但是粗心的程序员可能会为非基本类型的任务分配超负荷来做他/她想要的任何事情。

< P>已经给出的答案是正确的,但我想我会把C++添加进去。建议使用一种特定于C++的铸造符号,以使您的操作更加清晰。在这里,您可以使用:

long b;
b = static_cast<long>(a);
这非常清楚地说明了您正在执行的强制转换是如何在编译时计算强制转换的,并且您知道将执行正确类型的强制转换

char a = 0x01;

long b;
b = (long)a;
< P> C和C++是两种不同但密切相关的语言。在这种情况下,他们的规则恰好是一样的

不需要强制类型转换。作业可以,也可能应该写成:

b = a;
这会导致从char到long的隐式转换。由于转换的值在long类型的可表示范围内,因此转换结果为1。转换结果以值而不是表示形式指定

long类型中值1的表示形式可能在低阶位中有1,在所有其他位中有0。低阶位的位置可以变化;有些系统是大端,有些是小端,还有其他的可能性

不能保证long类型甚至有三个高阶字节。long类型的宽度至少为32位,但一个字节的宽度可以超过8位。如果纯字符有符号且LONG为1字节,则char类型的值甚至可能超过LONG\u MAX,这意味着char\u位>=32

long类型的表示也可能包括填充位,这些位不影响值。保证符号位为0,低阶值位为1,所有其他值位为0,但如果有填充位,则不保证其值。某些填充位的组合可能导致陷阱表示,它不表示任何值,但在这种特定情况下不会发生

大多数这些奇异的可能性在现实生活中都不太可能发生。某些DSP的C实现的字节宽度确实大于8位,但您使用的任何系统几乎肯定都有8位字节

关键是转换的结果是根据值定义的,而不是表示,99%的时间都是您需要关心的。如果你写:

char a = 1; /* same as 0x01 */
long b = a;
printf("b = %ld\n", b);

它将打印b=1,即使您使用的是奇异的系统,其中值1以奇怪的方式表示。

由于长字符可以表示字符的所有值,无论是有符号的还是无符号的,转换保证不会更改值

如果您最初有一个正值,因为在您的体系结构中字符是有符号的,或者因为字符值在0和127之间(假设为8位字符),那么结果long保证为正值,小于256。因此,在长为4字节的体系结构中,3个高阶字节保证为0

如果char是有符号的,如果初始值是负数,情况就不同了!该值将保持不变,并且仍然为负值。在一个普通的2'补码结构中,3个高阶位将是0xFF,b将是1;这始终是编译器和endianness独立的,是真的。此外,以下表达式将为真:

b == 1
b == 01
b == 0x1
b == 0x00000001
b == 0x00000000000000000000000000000000000000000000000000001
在所有情况下,右侧都是值为1的int常量;不多不少。请注意,零并不表示内存中的字节,int很可能没有上一个表达式显示的字节数。十六进制表示法只是写1的另一种方式,与1完全相同

特别是,我们不知道值为1的字节在内存中的位置,因为这取决于体系结构。它可能在int地址处,也可能在另一端,甚至在两者之间

现在有一件好事来了:C不关心int中的内存是如何布局的。写入整数常量的任何方法都不依赖于体系结构。这似乎可以通过十进制常量自我理解——我们是否认为int i=1的含义取决于体系结构?当然不是。int i=0x00000001;也不是;。位移位运算符也是如此:向低有效位移动 . 十进制或十六进制整数常量中的数字按顺序排列,以便最有效的数字位于左侧,与箭头式位移位运算符指示的方向对齐。可能反映也可能不反映机器的int表示;在个人电脑上,它不是

底线:如果你使用标准的C或C++方法来测试上面的3个字节,你就可以自由地在家里了,而下面的内容总是真实的,与实现或架构无关:

char a = 0x01;
long b = a;

(b & 0x11)       == 1 // least significant byte is 1
(b & 0x00000011) == 1 // exactly the same as above
(b & 0x11111100) == 0 // more significant three bytes are all 0

您的long可能有更多位,但这取决于实现。还有多少:它们都是零,除了最不重要的一个。

首先,你不需要演员阵容;这是标准转换。第二,使用初始化,而不是创建一个未初始化的变量,然后分配给它。长b=a;。上限或下限是一个wong术语,取决于endianness。但是是的,最重要的3个字节将是0。前面的注释适用,但请注意:如果char类型在您的平台上签名,则长变量将被符号扩展。示例:char a=0x90;长b=a;->b的内容可能不是您所期望的。long可以轻松地拥有8个字节,顺便说一句,b保证表示值0!?我想不是。这里代表的意思是什么。建议使用C++样式转换而不是C样式转换。但是在这种情况下,不建议使用任何类型的强制转换,因为转换是隐式进行的。当然,对于这样的事情总是显式的更好?不是真的。显式转换可以覆盖编译时检查。隐式转换更受限制,而且更安全。对于强制转换,读取器必须验证目标类型是否正确,例如b=static\u casta;将编译而无需抱怨。如果char是有符号的,char\u MAX不能大于LONG\u MAX。这仅在char是无符号的情况下才可能。
char a = 0x01;
long b = a;

(b & 0x11)       == 1 // least significant byte is 1
(b & 0x00000011) == 1 // exactly the same as above
(b & 0x11111100) == 0 // more significant three bytes are all 0