所以,我希望能够在我的C++程序中使用中文字符,并且我需要使用某种类型来保存超出ASCII范围的字符.
但是,我尝试运行以下代码,它工作正常.
#include <iostream>
int main() {
char snet[4];
snet[0] = '?';
snet[1] = '?';
snet[2] = '?';
std::cout << snet << std::endl;
int conv = static_cast<int>(snet[0]);
std::cout << conv << std::endl; // -96
}
Run Code Online (Sandbox Code Playgroud)
这是没有意义的,因为sizeof(char)在C++中,对于g ++编译器,求值为1,但中文字符不能用单个字节表示.
为什么这里的汉字被允许被安置在一个char类型?
在C++中应该使用什么类型来容纳中文字符或非ASCII字符?
我正在尝试为学校项目实施erathostenes的筛选,我决定使用位数组来实现.在我搜索材料时,我遇到了这三个宏,它们完美无缺,但我无法真正阅读(理解)它们.
#define ISBITSET(x,i) ((x[i>>3] & (1<<(i&7)))!=0)
#define SETBIT(x,i) x[i>>3]|=(1<<(i&7));
#define CLEARBIT(x,i) x[i>>3]&=(1<<(i&7))^0xFF;
Run Code Online (Sandbox Code Playgroud)
能否请你详细解释其中至少一个,我对C中的按位操作有基本的了解(基本上我知道它们"存在").
这会在另一个使用不同字节序的架构上工作吗?提前致谢.
我理解C语言在整数和浮点类型之间的隐式转换,但我对签名/无符号隐式类型转换有疑问.
例如,如果添加a unsigned char 和a signed int,结果类型是什么?它会是a unsigned int,a signed int还是别的什么?
我没有看到C99 ANSI标准中有任何具体内容,所以任何帮助都表示赞赏.
C++ 有很多类型模糊地描述相同的事物。假设我们正在针对一个字节为 8 位的架构进行编译,则以下所有类型都大致相似:
std::bytestd::uint8_tstd::bitset<8>unsigned char(8 位)char(8 位)如果一个字节是 8 位,那么所有这些类型或多或少可以互换吗?如果没有,什么时候需要使用一个而不是另一个?
我经常在 Stack Overflow 上看到诸如将十六进制字符串转换为字节数组之类的问题,其中有人使用std::uint8_t、char和unsigned char其他类型来表示“字节”。这只是风格偏好的问题吗?
注意:此问答旨在成为社区常见问题解答,鼓励进行编辑。std::byte尽管 C++17 已经引入了这似乎使得选择变得显而易见,但何时使用“字节”的类型以及为什么的问题始终出现。std::bitset提供一个常见问题解答来解决有关、std::uint8_t等作为“字节”的所有误解是很有用的。鼓励编辑。
我听说某些 64 位系统上有 16 位长字符类型。Intel 64 (EM64T) 系统上的 char 类型的大小是多少?
cstdinttypedef 肯定可以绑定到char变量.例如,它很可能uint_least8_t与之结合unsigned char并int_least8_t结合signed char.
标准是否保证类似的东西不会发生size_t或类似的类型?或者至少有一个纯理论上的机会,这些类型将绑定到某些字符类型,unsigned char甚至可能wchar_t?
为什么像字节中的位数这样基本的东西仍然由 C 标准实现定义?有没有这可能有用的例子?
从 C99,3.6(可在此处链接)
3.6 字节
数据存储的可寻址单元足够大,可以容纳执行环境基本字符集的任何成员
注 1:可以唯一地表达对象的每个单独字节的地址。
注 2:一个字节由连续的位序列组成,其数量由实现定义。最低有效位称为低位;最高有效位称为高位。
编辑:我问的是一些基本问题,为什么 C 标准在字节大小的位数方面提供了灵活性。不更具体地询问 sizeof(char) CHAR_BIT != 8 有什么好处。如果问题仍然看起来重复,请否决它,我将关闭问题。
可能存在断言失败的Python实现:
assert all(byte in range(256) for byte in any_bytes_object) # Python 3 semantics
assert all(byte in range(256) for byte in map(ord, any_bytes_object)) # Python 2
Run Code Online (Sandbox Code Playgroud)
POSIX明确指定CHAR_BIT == 8(每字节8位).Python中有类似的保证吗?它在某处记录了吗?
如果bytes没有定义name(在旧的Python版本上),例如,在Jython 2.5上,那么问题是关于str类型(bytestrings),即bytes = str在Python 2上.
为什么在gcc中编译以下代码不会产生任何类型不匹配警告?-1是int类型,并f()期望类型为char:
void f(char c) {}
int main(void)
{
f(-1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
即使我们明确指定了类型,也没有警告:
void f(unsigned char c) {}
int main(void)
{
f((signed int)-1);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
什么是好奇:如果我们指定超出范围的值,则打印警告:
void f(char c) {}
int main(void)
{
f(65535);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
warning: overflow in implicit constant conversion
gcc版本6.1.1
为什么int数据类型的大小在16位和32位体系结构中是不同的,而其他原始数据类型在两种体系结构中具有相同的大小?