有符号和无符号字符
Signed and unsigned char
为什么两个字符像signed char
和具有相同值的unsigned char
不相等?
char a = 0xfb;
unsigned char b = 0xfb;
bool f;
f = (a == b);
cout << f;
在上面的代码中,f
的值为 0。
当a
和b
具有相同的价值时,为什么会这样?
没有接受小于 int
的整数的算术运算符。因此,两个字符值都首先提升为 int
,请参阅积分提升 了解完整详情。
char
在您的平台上签名,因此0xfb
被提升为int(-5)
,而unsigned char
被提升为int(0x000000fb)
。这两个整数的比较不相等。
另一方面,[basic.fundamental] 中的标准要求所有 char 类型占用相同的存储量并具有相同的对齐要求;也就是说,它们具有相同的对象表示,并且对象表示的所有位都参与值表示。因此,memcmp(&a, &b, 1) == 0
是true
.
f
的值,实际上是程序的行为,都是实现定义的。
在C++14以后的1中,对于一个signed
char
,假设CHAR_MAX
是127
,a
可能会-5
。从形式上讲,如果char
signed
并且该数字不适合char
,则转换是实现定义的或实现定义的信号被提出。
b
是251
.
对于比较a == b
(并保留char
比int
更窄的假设(,两个参数都转换为int
,因此保留-5
和251
。
这很false
,因为数字不相等。
最后,请注意,在 char
、 short
和 int
大小相同的平台上,代码的结果将是true
的(==
将是unsigned
类型(!这个故事的寓意是:不要混合你的类型。
1 C++14 删除了 1 的补码并签署了星等signed char
。
- 有符号(
char
的值范围[-128, 127]
。(C++14 下降 -127 作为下限(。 unsigned char
的值范围[0, 255]
您尝试分配给两个变量的内容以十进制251
。由于char
无法保存该值,因此您将遭受值溢出,如以下警告所示。
警告:从"int"到"char"的转换中的溢出会将值从"251"更改为"\37777777773" [-Woverflow]
因此a
可能会保持价值-5
而b
将是251
的,它们确实不平等。
- 从矢量<无符号字符>转换为字符* 包括垃圾数据
- C++中无符号字符溢出
- 使用无符号字符数组有效存储内存
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 如何在保持其值的同时将 c++ 无符号字符变量转换为 char 变量
- 从 std::vector<无符号字符>切片中提取 int?
- 将无符号字符的向量存储在数组中会给我 std::bad_alloc
- 使用 fopen 打开 .pak 文件并使该文件应用于 const 无符号字符* (C++)
- 库特无符号字符
- 寻找一种更好的方法来表示无符号字符数组
- C++ 无符号字符 *{varName};-> C#
- 如何返回/复制unique_ptr<无符号字符[]>的值?
- 将浮点数转换为无符号字符数组并打印出来
- 在函数中返回无符号字符数组,但不返回指针
- 如何在 C/C++ 中将无符号字符*转换为无符号字符数组?
- 如何返回实际值(在我的例子中是无符号字符数组)而不是来自 C++ 函数的指针?
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 无符号字符打印其 ASCII 值
- 字符数组到无符号字符 *
- 是否可以在 c++ 中将两位数保存在无符号字符中