将' unsigned char '放入' char '中
Put an `unsigned char` into a `char`
我想通过移位将unsigned char
存储到char
中。由于这两种数据类型具有相同的长度(在我的机器上为1字节),我希望下面的代码可以工作:
#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int main () {
printf ("%dn", sizeof(char));
printf ("%dn", sizeof(unsigned char));
unsigned char test = 49;
char testchar = (char) (test - 127);
printf ("%xn", testchar);
return 0;
}
,但它没有。特别是,我得到了以下输出:
1
1
ffffffb2
表示该字符已被强制转换为int
。有人能解释一下吗,希望能解决这个问题?
%x
是4字节int
的说明符。要打印一个字节的char
,使用%hhx
。
printf
根据传递给它的格式说明符对其参数进行类型转换。这就是testchar
被提升为int
的原因。
printf是一个可变参数函数,因此它的参数受默认提升规则的约束。在这种情况下,您的字符被提升为int型,并在此过程中进行符号扩展。二进制模式为0xffffffb2的4字节2的补码int为-78。使用%hhx
说明符将其作为字符打印。
参见在打印字符时发生哪些积分提升?
%x
仅用于打印unsigned int
,然而您提供了char
。
使用%x
和char
的负值会导致未定义的行为。
旁白: printf
的C标准规范不是特别清楚;有些人认为传递除了unsigned int
之外的任何东西都会导致未定义的行为。其他人(包括我自己)认为传递不明确为unsigned int
的参数是可以的,但在默认参数提升之后,具有非负值的int
类型。该标准保证非负的int
s与具有相同值的unsigned int
具有相同的表示。
其他一些答案建议%hhx
,但这并不比%x
好。标准(根据合理的解释)指定%hhx
只能与unsigned char
参数一起使用,%hhd
只能与signed char
参数一起使用。对于普通的char
,实际上没有修饰符。
无论您如何看待它,printf
都无法以良好定义的方式将负值转换为正表示。必须自己转换实参,然后使用匹配的格式说明符。在本例中:
printf ("%hhxn", (unsigned char)testchar);
是一个选项。IMO %x
可以在这里使用,但如上所述,有些人不同意。
NB。在printf ("%dn", sizeof(char));
及其后面的行中使用了错误的格式说明符。size_t
的指定符为%zu
。因此,您可以使用%zu
,或将参数强制转换为int
,甚至更好:
printf("1n");
发生的事情是!!!!
1) unsigned char test
= 49
;//十六进制值31被分配
2) char testchar = (char) (test - 127);
//49-127 = -78
ie;0xb2
(作为unsigned
),将其转换为signed char
,结果F
在b2
之前填充以表示它为负
3) printf ("%xn", testchar);
//由于%x
是4字节整型(如@Don't You Worry Child所说)ffffffb2
的说明符,因此得到4字节的输出
所以尽量按照@Don't You Worry Child said
我希望下面的代码可以工作:
它不会。
忽略其他人指出的如何打印字符的问题,在标准中并不能保证您的代码可以正常工作。为什么?因为char
不一定是符号。char
是signed
还是unsigned
取决于具体实现。有些实现使char
有符号,有些实现使它无符号。
因此,不能保证(char) (test - 127)
会产生一个可以由char
表示的值。
c++(14)允许unsigned char
和char
之间的无损转换。标准说(3.9.1/1):
对于0 ~ 255范围内
unsigned char
类型的每一个值i,存在一个char
类型的值j,使得从i到char
的整数转换(4.7)的结果为j,从j到unsigned char
的整数转换的结果为i。
- 将一系列整数放入类的最佳方法是什么?
- 如何在 c++ 中比较 2 个链表并将匹配的数据放入另一个链表中
- 获取 QInputEvent 在 Qt 4.8 中被放入 QEventLoop 队列时的时间戳
- 在将字符串放入字符串向量时遇到问题?
- 输入验证将数字放入向量中
- 有什么方法可以将具有不同模板参数的模板类实例放入向量中?
- 如何在 EOF 之前从文件中读取并将其放入字符串中?
- 我可以将新的 std::tuple 放入内存映射区域,并在以后读回吗?
- 将 int 放入 char 数组是否在法律上需要新的放置
- 我如何将许多char*数组放入二维数组中
- 取wchar_t并放入char
- Char和int放入同一数组中
- 如何将"int"值放入"const char*"中
- 如何将无符号的 int 放入 char 数组并将其解压缩回来
- 如何在c++中将字符串放入char*变量中
- 将std::字符串放入char[][]数组中
- 如何将字符串流内容放入char而不是字符串类型
- 使用memcpy()函数将字节从无符号char数组放入std::string
- 在c++中将int的最低有效位放入char中
- 将' unsigned char '放入' char '中